插入一行并返回其主键

时间:2012-01-18 17:47:11

标签: ssis

在SSIS中,如何使用执行SQL任务插入没有参数的单行并获取主键,以便将其设置为用户变量?我的插入查询只是:

INSERT INTO [AdWords.ImportData] (EndDate) VALUES (null)

3 个答案:

答案 0 :(得分:19)

好问题,带我试了几下。声明一个Int32类型的SSIS变量(除非您需要为bigint或数字调整大小)。我选择tablePk作为我的。

选项1

执行SQL任务

  • 常规标签

ResultSet:无

SQL

INSERT INTO dbo.ImportData (EndDate) VALUES (NULL);
SELECT ? = SCOPE_IDENTITY()
  • 参数映射选项卡

变量名称:User :: tablePk

方向:输出

数据类型:长

参数名称:0

参数大小:-1

选项2

这是原始解决方案,因为我无法理解如何在正常查询中获取占位符?。它不能像我上面那样简单,除非是。

唯一的区别是使用的查询

SQL

DECLARE @sql nvarchar(500)
, @paramDef nvarchar(500)

SELECT
    @sql = N'INSERT INTO dbo.ImportData (EndDate) VALUES (NULL);
    SELECT @ident = SCOPE_IDENTITY();'
,   @paramDef = N'@ident int OUTPUT'
EXECUTE sp_executesql @sql, @paramDef, @ident = ? OUTPUT

选项3

如果您正在使用数据流,我在How to Add the Result Set from a T-SQL Statement to a Data Flow?概述了一种方法。简而言之,您需要在OLE DB命令之前向数据流中添加一列。在OLE DB命令中,您将该空列映射到存储过程中的OUTPUT参数,然后在存储过程触发时,它将使用过程中的值替换该列。

答案 1 :(得分:5)

除了bilinkc的版本,没有参数:

执行SQL任务

常规标签 ResultSet:单行

SQL

INSERT INTO dbo.ImportData (EndDate) VALUES (NULL);
SELECT SCOPE_IDENTITY() AS LastId

在单行结果集的映射中,在结果名称框中输入LastId,并映射到您的变量。

使用单个输出参数(bilinkc的版本)可能稍微快一些,取决于SSIS如何“覆盖”它以及它是否创建一个完整的datareader而不是一个带有输出参数的sp_ExecuteSQL调用。

答案 2 :(得分:0)

这是我认为非常干净的另一种选择。 它使用OUTPUT syntax和结果集而不是参数映射,这需要更少的配置。

insert dbo.ImportData (EndDate) 
output inserted.Id 
values (NULL);
  • 将此语句中的Id替换为您的标识列的名称。
  • 使用“单行”作为结果集类型。
  • 无参数映射
  • 将其添加到结果集 选项卡:结果名称:0(表示第一列)并选择您的变量名称,例如 User::tablePk(变量类型:Int32)