SSIS OLE DB SQL COMMAND - Получение возвращаемого значения из вложенной хранимой процедуры - PullRequest
2 голосов
/ 06 августа 2020

В SSIS у меня есть команда OLE DB SQL в моем потоке данных, которая выполняет хранимую процедуру, которая, в свою очередь, выполняет «вложенную» хранимую процедуру (uspMyNestedSP). Кажется, я не могу получить ВОЗВРАТ из вложенной хранимой процедуры. Все возвращаемые SSIS - это int @RETURN_VALUE, а не строка, возвращаемая в хранимой процедуре.

Обратите внимание, я не могу изменить uspMyNestedSP.

Я пробовал использовать параметры и настройки OUTPUT RETURN к этому, но все, что я получаю, - это пустая строка.

Мне нужно сделать это в OLE DB SQL Команду построчно.

Единственное Другой способ, который я могу придумать, - это разделить поток данных на два потока данных и сделать это с помощью SQL ЗАДАЧИ?

Вот хранимая процедура:

ALTER  PROCEDURE [dbo].[uspMyMainSP]
    @_EthnicityIOCode NCHAR(20),
    @_EthnicityDescription NVARCHAR(60)
AS
    DECLARE @EthnicityCode NCHAR(8) 
    DECLARE @EthnicityDescription NVARCHAR(60)
    DECLARE @AuditMessage NVARCHAR(128)

    SET NOCOUNT ON;

    IF LEN(TRIM(@_EthnicityIOCode)) > 0 AND LEN(TRIM(@_EthnicityDescription)) > 0
    BEGIN
        SELECT  
            @EthnicityCode = ethEthnicityCode,
            @EthnicityDescription = ethDescription
        FROM    
            TC36sp1.dbo.Ethnicity
        WHERE   
            (ethIOCode = @_EthnicityIOCode)

        IF @@ROWCOUNT = 0 
        BEGIN
            --  Insert
            EXEC uspMyNestedSP '*df', @_EthnicityDescription, @_EthnicityIOCode, 1
            SET @AuditMessage = '''' 
        END
        ELSE
            IF @_EthnicityDescription <> @EthnicityDescription
            BEGIN
                -- Update
                EXEC uspMyNestedSP '*df', @_EthnicityDescription, @_EthnicityIOCode, 1
                SET @AuditMessage = ''''
            END

    -- This is what I want to return back to SSIS!...
    RETURN @EthnicityCode 
END

@EthnicityCode строка - это то, что я хочу вернуть. Это отлично работает и возвращается при запуске вручную в SSMS.

Вот моя SQL команда в SSIS:

EXEC  ? =uspMyMainSP ?, ?

Ответы [ 2 ]

0 голосов
/ 09 августа 2020
  1. RETURN может возвращать только int, поэтому его нельзя использовать для возврата значения string. Spe c:

https://docs.microsoft.com/en-us/sql/t-sql/language-elements/return-transact-sql?view=sql-server-ver15

Попробуйте это в SSMS, и вы увидите следующее сообщение об ошибке:

Conversion failed when converting the nvarchar value 'test ' to data type int.

ALTER PROCEDURE [dbo].[uspMyMainSP]
AS
BEGIN
    DECLARE @EthnicityCode NCHAR(8) = 'test'

    RETURN @EthnicityCode 
END

GO

EXEC [dbo].[uspMyMainSP]

Вместо этого вы можете вернуть SELECT @EthnicityCode as EthnicityCode как набор результатов одной записи и обработать его в потоке данных.

Или используйте параметр OUTPUT с небольшая хитрость: чтобы иметь возможность использовать параметр OUTPUT, вам необходимо сопоставить его с параметром INPUT, поэтому вам нужен фиктивный входной параметр. Определите параметр фиктивной строки (Derived Column Name, установите его как NULL(DT_STR))

См. Здесь для более подробного объяснения

https://radacad.com/output-parameter-of-stored-procedure-in-ole-db-command-ssis

ALTER  PROCEDURE [dbo].[uspMyMainSP]
    @_EthnicityIOCode NCHAR(20),
    @_EthnicityDescription NVARCHAR(60), 
    @EthnicityCode NCHAR(8) OUTPUT   ----added
AS
    -- DECLARE @EthnicityCode NCHAR(8)  ---removed
....



EXEC [dbo].[uspMyMainSP] ?, ?, ? output
0 голосов
/ 06 августа 2020

Вот как это сделать с помощью скриптового компонента:

        string sql = "dbo.uspMyNestedSP";
        using (OleDbConnection conn = new OleDbConnection(cstr))
        {
            using (OleDbCommand cmd = new OleDbCommand(sql, conn))
            {
                cmd.CommandType = System.Data.CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("@p1", Row.[ColumnName]);
                cmd.Parameters.AddWithValue("@p2", Row.ColumnName);
                conn.Open();
                string EthnicityCode = cmd.ExecuteScalar();
            }
        }
...