使用SSIS中的“OLE DB命令”从插入中返回GUID Id

时间:2016-03-08 18:57:04

标签: sql-server ssis

在我的SSIS数据流中,我试图使用OLE DB COMMAND在我的表中执行插入并返回新生成的GUID Id值。

根据我的findings,这就是我在SqlCommand标签上提供Component Properties属性

EXECUTE sp_executesql 
N'DECLARE @generated_keys TABLE([Id] UNIQUEIDENTIFIER); 
  INSERT INTO myTable ([FirstName], [LastName]) 
  OUTPUT Inserted.Id INTO @generated_keys 
  VALUES (?,?); 
  SELECT TOP 1 @ident = Id FROM @generated_keys', 
N'@ident UNIQUEIDENTIFIER OUTPUT', 
@ident = ? OUTPUT

当我添加此内容并点击Refresh标签上的Component Properties按钮时,我看到以下错误。

SSIS Error Code DTS_OLEDBERROR. An OLE DB error has occurred.
Error Code: 0x80004005.
An OLE DB record is available. Source: "Microsoft SQL Server Native Client 11.0" 
Hresult: 0x80004005   Description: "Syntax error, permission violation, or other nonspecific 
error".

我正在使用连接到Sql Server 2014数据库的Visual Studio 2015的SSIS加载项。我还检查并确保数据库用户具有正确的权限。

1 个答案:

答案 0 :(得分:0)

不知道参数定义的语法,但您错过了@ident变量声明,并试图将名称或值或参数放入sp_executesql调用,这是不允许的。在下面的示例中,@ident是从动态查询中声明并获得的。

GO
create table testtable
(
  id UNIQUEIDENTIFIER not null default newid(),
  [FirstName]   varchar(100),
  [LastName]    varchar(100)
)
GO
declare @ident uniqueidentifier

EXECUTE sp_executesql 
N'DECLARE @generated_keys TABLE([Id] UNIQUEIDENTIFIER); 

  INSERT INTO testtable([FirstName], [LastName]) 
  OUTPUT Inserted.Id INTO @generated_keys 
  VALUES (''test'', ''test''); 

  SELECT TOP 1 @ident = Id FROM @generated_keys', 
N'@ident UNIQUEIDENTIFIER OUTPUT',
@ident OUTPUT

select @ident
GO
drop table testtable
GO

可能你需要最后一行: set ? = @ident 或者用sp_executesql替换?的最后一个参数:

EXECUTE sp_executesql N'...sql...',
  N'@ident UNIQUEIDENTIFIER OUTPUT',
  ? OUTPUT

在这种情况下,我假设您不需要declare部分。