我在SSIS包上遇到以下错误:
[执行SQL任务]错误:执行查询“EXEC [spGetFileId] @zFileName,@ Id”失败,并显示以下错误:“分配给变量”User :: FileId“的值的类型与当前不同变量类型。变量在执行期间不能改变类型。变量类型是严格的,除了Object类型的变量。
我创建了一个执行SQL任务,它在SQL服务器上执行一个简单的存储过程:
CREATE PROCEDURE [dbo].[spGetFileId]
@zFileName VARCHAR(255),
@Id INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @Id = [Id]
FROM [tblFileLog]
WHERE [zFileName] = @zFileName
END
任务的 SQLStatement 属性为:
EXEC [spGetFileId] @zFileName, @Id
我有以下 SSIS变量:
- 用户::文件(字符串)
- User :: FileId (Int)
并且参数映射到SQL任务上,如下所示:
- 变量|方向|输入|参数
- 用户::文件 |输入|字符串| @zFileName
- User :: FileId |输出| Int32 | @Id
我尝试过使用变量类型(int16
,int32
和int64
;甚至是字符串),但错误仍然存在。请帮忙!
修改
调试存储过程我在PRINT @Id
之前添加了END
,这会输出预期值,但在执行SELECT @Id
(输出参数)时会返回NULL
。< / p>
EDIT2:
一位同事发现了这个问题并提供了他的解决方案,我在下面将其标记为答案。
答案 0 :(得分:3)
执行SQL任务上的 SQLStatement 必须在OUTPUT
参数后包含@Id
:
EXEC [spGetFileId] @zFileName, @Id OUTPUT
您需要将@User :: FileID参数设置为Output参数,以将变量设置为readwrite而不是readonly,以便将其写入。
答案 1 :(得分:2)
使用结果集,将ResultSet设置为“Single row”,并将结果映射到变量,而不是使用输出参数:
CREATE PROCEDURE [dbo].[spGetFileId]
@zFileName VARCHAR(255)
AS
BEGIN
SET NOCOUNT ON;
SELECT [Id]
FROM [tblFileLog]
WHERE [zFileName] = @zFileName
END
答案 2 :(得分:1)
确保您为执行SQL任务使用OLE DB连接并阅读本文 - http://www.bidn.com/blogs/BillBrannen/bidn-blog/612/stored-procedure-return-values-and-output-parameters-in-ssis