问题描述
我在SSIS包中有一个OLE DB Command任务,该任务接收参数,将其插入到链接服务器的表中,并返回在链接服务器上创建的ID。
当我在SSMS中运行查询时,它可以工作,但是在SSIS中,我在主题行中收到错误消息。
OLE DB命令中的sqlCommand是:
DECLARE
@UserId int = ?,@ContactUsId int = ?,@CreateDate datetime = ?,@Subject nvarchar(500) = ?,@InteractionClusterId int = null -- We will be testing for this being null
-- removed some irrelevant code here
-- if all else Failed,insert a new record to MngInteractionCluster
if @InteractionClusterId is null
begin
declare @RemoteQuery nvarchar(max) = N'
insert into BI_Mng.dbo.MngInteractionCluster
(
UserId,ContactUsId,CreateDateTime,[Subject]
)
values
(
@UserId,@ContactUsId,@CreateDate,@Subject
)
SELECT @InteractionClusterId_OUT = ScopE_IDENTITY()'
declare @Params nvarchar(1000) = N'
@UserId int,@ContactUsId int,@CreateDate datetime,@Subject nvarchar(500),@InteractionClusterId_OUT int OUTPUT'
EXEC [BI_WAREHOUSE\BI_GLOBAL].master.dbo.sp_executesql
@RemoteQuery,@Params,@UserId = @UserId,@ContactUsId = @ContactUsId,@CreateDate = @CreateDate,@Subject = @Subject,@InteractionClusterId_OUT = @InteractionClusterId OUTPUT;
end
select
? = @InteractionClusterId
在此将其解析为SSIS的任何帮助将不胜感激!
解决方法
我最终将繁重的工作转移到本地服务器上的存储过程中。 现在,OLE DB命令组件中的代码很简洁
DECLARE
@OriginalMailId int = ?,@UserId int = ?,@ContactUsId int = ?,@CreateDate datetime = ?,@Subject nvarchar(500) = ?,@isAutoReply bit = ?,@BIEnvironmentId int = ?,@InteractionClusterId int
exec BI_Mng.dbo.GetInteractionClusterId
@OriginalMailId,@UserId,@ContactUsId,@CreateDate,@Subject,@isAutoReply,@BIEnvironmentId,@InteractionClusterId OUTPUT
select ? = @InteractionClusterId
在存储过程中,有一个对链接服务器上sp_ExecuteSQL的远程执行的调用。为了让SSIS解析它,至关重要的是,它必须包含WITH RESULT SETS子句,如下所示:
declare @RemoteQuery nvarchar(max) = N'
insert into BI_Mng.dbo.MngInteractionCluster
(
UserId,ContactUsId,CreateDateTime,[Subject]
)
values
(
@UserId,@Subject
)
SELECT @InteractionClusterId_OUT = SCOPE_IDENTITY()'
declare @Params nvarchar(1000) = N'
@UserId int,@ContactUsId int,@CreateDate datetime,@Subject nvarchar(500),@InteractionClusterId_OUT int OUTPUT'
EXEC [BI_WAREHOUSE\BI_GLOBAL].master.dbo.sp_executesql
@RemoteQuery,@Params,@UserId = @UserId,@ContactUsId = @ContactUsId,@CreateDate = @CreateDate,@Subject = @Subject,@InteractionClusterId_OUT = @InteractionClusterId OUTPUT
WITH RESULT SETS NONE;