Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssis 插入一行并返回其主键_Ssis - Fatal编程技术网

Ssis 插入一行并返回其主键

Ssis 插入一行并返回其主键,ssis,Ssis,在SSIS中,如何使用execute SQL任务插入不带参数的单行,并取回主键,以便将其设置为用户变量?我的insert查询很简单: INSERT INTO [AdWords.ImportData] (EndDate) VALUES (null) 问得好,我试了几次才弄明白。声明类型为Int32的SSIS变量(除非需要调整bigint或数字的大小)。我选择了tablePk作为我的 选择1 执行SQL任务 常规选项卡 结果集:无 SQL 参数映射选项卡 变量名称:User::tableP

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

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

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

选择1 执行SQL任务

  • 常规选项卡
结果集:无

SQL

  • 参数映射选项卡
变量名称:User::tablePk

方向:输出

数据类型:Long

参数名称:0

参数大小:-1

选择2 这是最初的解决方案,因为我无法在普通查询中找到占位符
。它不能像我上面所说的那样简单,除非它是

唯一的区别是所使用的查询

SQL

选择3
如果您使用的是数据流,我将概述一种方法,简而言之,您需要在OLEDB命令之前向数据流中添加一列。在OLE DB命令中,您将该空列映射到存储过程中的
输出
参数中,然后当存储过程启动时,它将用该过程中的值替换该列。

也可以使用bilinkc的版本,不带参数:

执行SQL任务

常规选项卡 结果集:单行

SQL

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


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

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

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

OLE DB或ADO.NET连接?这3个选项都没有使用大容量插入。是否可以使用批量插入并获取作用域标识?@ile他们为什么要演示批量插入?这个问题特别询问如何使用executesql任务插入一行。如果您对使用批量插入和生成的标识有疑问,我建议您单击“提问”按钮。提供一个样本数据和预期的输入和输出。是的,我现在看到我的评论很奇怪。。。我确实发布了一个问题
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
INSERT INTO dbo.ImportData (EndDate) VALUES (NULL);
SELECT SCOPE_IDENTITY() AS LastId
insert dbo.ImportData (EndDate) 
output inserted.Id 
values (NULL);