0

我正在使用 SSIS 执行 SQL 任务来执行存储过程。在存储过程中,我传递某些输入值并将其插入到表中。该表有一个唯一标识符作为主键。作为返回输出,我需要当前值的唯一标识符。所以我把它带到一个变量@logid,如下所示

INSERT INTO logging.execution_log
            (ParentLogID,
             Description,
             PackageName,
             PackageGuid,
             MachineName,
             ExecutionGuid,
             LogicalDate,
             Operator,
             StartTime,
             EndTime,
             Status,
             FailureTask)
SELECT @ParentLogID,
       @Description,
       @PackageName,
       Cast(@PackageGuid AS UNIQUEIDENTIFIER),
       @MachineName,
       Cast(@ExecutionGuid AS UNIQUEIDENTIFIER),
       @logicalDate,
       @operator,
       Getdate(),
       NULL,
       @status,
       NULL

SET @LogID = Cast(Scope_identity() AS INT) ----@logid is output variable from ssis

但它没有给出预期的结果。这里已经使用set运算符对@logid 完成了全局变量的分配,并映射到执行 sql ssis 任务变量。经过一番研究,我发现为了分配全局变量,我必须将SET NOCOUNT选项设置为 SQL 查询中的第一条语句。我也这样做了。但它没有返回任何东西...... .by the way *为什么我们需要设置这个SET NOCOUNT参数???*欢迎任何帮助

4

3 回答 3

1

为了让参数返回在过程主体中分配的值,必须在过程中使用OUT/OUTPUT关键字声明参数,如下所示:

CREATE PROCEDURE procname (
@logID int OUTPUT,
other parameters
)
AS
body statements

此外,语句中的相应参数EXEC应提供相同的关键字(OUTOUTPUT),如下所示:

EXEC procname @someGlobalVar OUTPUT, other arguments
于 2012-06-15T18:58:25.853 回答
0

您始终可以SELECT SCOPE_IDENTITY() AS LogID在执行 SQL 任务结束时将预期结果集设置为单行,并使用单列 LogID 配置结果并将其映射到您的 SSIS 全局变量。

让我知道您是否需要我澄清这些。

于 2012-06-15T15:34:50.183 回答
0

您可以使用 Scope_Identity 来获取用于标识列的唯一标识符。

要获得唯一标识符,您需要在使用之前将其分配给变量

Set @LogID = NewID()

INSERT INTO logging.execution_log VALUES(...., @logID, ...)

除非您误解了唯一标识符的含义

标识列是自动生成的整数 1、2、3、4 序列......并与 Scope_Identity 一起使用。

于 2012-06-15T15:40:41.697 回答