0

我在 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 变量

  • 用户::文件(字符串)
  • 用户::FileId (Int)

并将参数映射到 SQL 任务上,如下所示:

  • 变量 | 方向 | 类型 | 范围
  • 用户::文件| 输入 | 字符串 | @z文件名
  • 用户::文件 ID | 输出 | 整数32 | @ID

我尝试过使用变量类型(int16,int32int64; 甚至是字符串),但错误仍然存​​在。请帮忙!

编辑:

调试存储过程我在PRINT @Id之前添加了一个END,这会输出预期的值,但是在执行SELECT @Id(输出参数)时会返回NULL

编辑2:

一位同事发现了问题并提供了他的解决方案,我在下面标记为答案。

4

3 回答 3

5

执行 SQL 任务上的SQLStatement必须在参数之后包含:OUTPUT@Id

EXEC [spGetFileId] @zFileName, @Id OUTPUT

并且您需要将您的 @User::FileID 参数设置为 Output 参数,以将变量启用为读写而不是只读,以便将其写入。

于 2013-10-24T14:49:47.563 回答
2

不使用输出参数,而是使用结果集,将 ResultSet 设置为“单行”并将结果映射到您的变量:

CREATE PROCEDURE [dbo].[spGetFileId]
    @zFileName VARCHAR(255)
AS
BEGIN
    SET NOCOUNT ON;
    SELECT  [Id]
    FROM    [tblFileLog]
    WHERE   [zFileName] = @zFileName
END

在此处输入图像描述

于 2013-10-24T14:33:14.113 回答
1

确保您为执行 SQL 任务使用 OLE DB 连接并阅读这篇文章 - http://www.bidn.com/blogs/BillBrannen/bidn-blog/612/stored-procedure-return-values-and-输出参数在-ssis

于 2013-12-01T19:06:54.480 回答