【问题标题】:Insert a single row and return its primary key插入一行并返回其主键
【发布时间】:2012-01-18 17:47:10
【问题描述】:

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

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

【问题讨论】:

  • OLE DB 或 ADO.NET 连接?

标签: ssis


【解决方案1】:

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

选项 1

执行 SQL 任务

  • 常规选项卡

结果集:无

SQL

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

变量名:User::tablePk

方向:输出

数据类型:长型

参数名称:0

参数大小:-1

选项 2

这是最初的解决方案,因为我不知道如何在 normal 查询中获取占位符 ?。它不可能像我上面所说的那么简单,除了它是。

唯一的区别是使用的查询

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 参数,然后当存储过程触发时,它将用过程中的值替换该列。

【讨论】:

  • 这三个选项都没有使用批量插入。是否可以使用批量插入并获取 scope_identity?
  • @ile 为什么他们演示批量插入?该问题专门询问有关使用执行 SQL 任务插入一行的问题。如果您对使用批量插入和生成的身份有疑问,我建议您单击“提问”按钮。提供样本数据和预期的输入和输出。
  • 是的,我现在看到我的评论很奇怪......我确实发布了一个问题stackoverflow.com/questions/28583291/…
【解决方案2】:

替代bilinkc的版本,不带参数:

执行 SQL 任务

常规选项卡 结果集:单行

SQL

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

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

使用单个输出参数(bilinkc 的版本)可能会稍微快一些,这取决于 SSIS 是如何“在幕后”进行的,以及它是否创建完整的数据读取器而不是使用输出参数的单个 sp_ExecuteSQL 调用。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      • 1970-01-01
      • 2018-04-18
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多