【问题标题】:SSIS OLE DB SQL COMMAND - Getting return value from nested stored procedureSSIS OLE DB SQL COMMAND - 从嵌套存储过程中获取返回值
【发布时间】:2020-08-06 10:21:51
【问题描述】:

在 SSIS 中,我的数据流中有一个 OLE DB SQL 命令,它执行一个存储过程,该过程又执行一个“嵌套”存储过程 (uspMyNestedSP)。我似乎无法从嵌套存储过程中获得 RETURN。所有 SSIS 返回的是 int @RETURN_VALUE,而不是存储过程中返回的字符串。

注意,我无法更改uspMyNestedSP

我尝试使用OUTPUT 参数并将RETURN 设置为此,但我得到的只是一个空字符串。

我需要在 OLE DB SQL 命令中逐行执行。

我能想到的唯一其他方法是将数据流拆分为两个数据流,并在其间设置一个 SQL TASK?

这是存储过程:

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 中手动运行时返回。

这是我在 SSIS 中的 SQL 命令:

EXEC  ? =uspMyMainSP ?, ?

【问题讨论】:

  • 我不认为 OLEDB 命令可以处理任何输出。我对这样的项目使用脚本组件。当您需要了解自己的身份价值时,这是更常见的做法。

标签: sql-server ssis oledbcommand


【解决方案1】:

下面是使用脚本组件的方法:

        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();
            }
        }

【讨论】:

    【解决方案2】:
    1. RETURN 只能返回int,因此它不能用于返回string 值。规格:

    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]
    
    1. 您可以将SELECT @EthnicityCode as EthnicityCode 作为单个记录结果集返回并在数据流中向下处理。

    2. 或者使用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
    

    【讨论】:

    • 感谢您的回复。以上是行不通的。我需要澄清嵌套的 SP 'uspMyNestedSP' 实际上返回了我想要作为“未命名列”的字符串值,这就是我想要捕获到我的数据工作流中的值。但是我无法更改此嵌套 SP 中的任何内容。
    • 您的 SP 在当前状态下将无法工作。您试图通过RETURN 返回string,它只允许数字返回值。你不需要改变你的 SP。
    • 更新了我的答案,给你一个小例子来测试,看看你不能返回字符串
    猜你喜欢
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 2013-01-22
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多