Выполнение более чем одной команды в хранимой процедуре - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь запустить эту хранимую процедуру, но она запускает только первую команду, хотя я могу без проблем запустить скрипт вне хранимой процедуры

exec GetStoreTransfers '010203','010304'

, но она только возвращает результат первой команды:

output
----------------------------------------------------------------------------------------------------
1 file(s) copied.
NULL

(2 row(s) affected)

(0 row(s) affected)

Это хранимая процедура, но выполняется только первая команда:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[GetStoreTransfers] 
    (@fromdate nvarchar(8),
     @todate nvarchar(8))
AS
    DECLARE @from nvarchar(8)
    DECLARE @to nvarchar(8)
    DECLARE @to_ nvarchar(16)
    DECLARE @from_ nvarchar(16)
    DECLARE @cmdcopy nvarchar(1000)
    DECLARE @command nvarchar(max)

    SET @from = @fromdate
    SET @to = @todate

    SET @from_ = LEFT(CONVERT(char(16), CAST(@from AS date), 105), 5)
    SET @to_ = LEFT(CONVERT(char(16), CAST(@to AS date), 105), 5)

    SELECT @cmdcopy = /* a specific string*/

    SELECT @command = /* a set of commands*/

    exec xp_cmdshell @cmdcopy
    exec sp_executesql @command

Результат всего запроса без использования хранимой процедуры выглядит следующим образом

  output
--------------------------------------------------------------------------------------------------------
        1 file(s) copied.
NULL

(2 row(s) affected)

(23654 row(s) affected)

Пожалуйста, помогите мне преодолеть эту проблему, я не хочу использовать SQL Работа, это более простой обходной путь, но это не то, что я хочу.

Ответы [ 3 ]

0 голосов
/ 13 января 2020

Вам следует попробовать блок TRY / CATCH, а также попытаться получить результат xp_cmdshell:

BEGIN TRY
    DECLARE @Error    INT;

    select @cmdcopy = /*A specific String*/

    select @command=/*A Set of commands*/

    exec @Error = xp_cmdshell @cmdcopy

    IF(@Error <> 0)
        /*Do some stuff*/
    END

    exec @Error = sp_executesql @command 

    IF(@Error <> 0)
        /*Do some stuff*/
    END
END TRY
BEGIN CATCH
    PRINT(ERROR_MESSAGE())
END CATCH

Попробуйте и сообщите нам:)

С уважением!

0 голосов
/ 13 января 2020

Извините, что беспокою вас всех

Оказывается, когда я выполнял про c, я использовал недопустимые параметры, которых нет в таблицах, из которых я пытался получить данные, теперь он работает нормально после изменения параметров @fromdate и @todate.

0 голосов
/ 13 января 2020

Вам нужен блок begin / end:

alter procedure [dbo].[GetStoreTransfers] (
    @fromdate nvarchar(8),
    @todate nvarchar(8)
) as
begin
    declare @from nvarchar(8)
    declare @to nvarchar(8)
    declare @to_ nvarchar(16)
    declare @from_ nvarchar(16)
    declare @cmdcopy nvarchar(1000)
    declare @command nvarchar(max)

    set @from=@fromdate
    set @to=@todate

    set @from_=left(convert(char(16),cast(@from as date),105),5)
    set @to_=left(convert(char(16),cast(@to as date),105),5)

    select @cmdcopy = /*A specific String*/

    select @command=/*A Set of commands*/

    exec xp_cmdshell @cmdcopy

    exec sp_executesql @command    
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...