SSIS绑定存储过程输出参数到变量报错:值不在预期范围内
解决SSIS绑定存储过程输出参数时的“Value does not fall within the expected range”错误
问题背景
有如下SQL Server存储过程:
CREATE PROCEDURE [log].[SP_LogExecutionStep] @ExecutionGUID [uniqueidentifier], @ProjectName NVARCHAR(50) = NULL , @PackageName NVARCHAR(255) = NULL , @PackageVersion NVARCHAR(10) = NULL, @ParentPackageName NVARCHAR(255) = NULL, @ParentExecutionID INT = NULL, @ExecutionStatus NVARCHAR(50) = NULL, @ExecutionResult NVARCHAR(50) = NULL, @ExecutionMessage NVARCHAR(255) = NULL, @ExecutionID INT OUTPUT AS BEGIN -- Start Logging. INSERT INTO log.T_LOG_Execution (ID_ExecutionGUID, LB_ProjectName, LB_PackageName, LB_PackageVersion, LB_ParentPackageName, ID_ParentExecutionId, LB_ExecutionStatus, LB_ExecutionResult, LB_ExecutionMessage, DT_ExecutionStartDate) SELECT @ExecutionGUID, @ProjectName, @PackageName, @PackageVersion, @ParentPackageName, @ParentExecutionId, @ExecutionStatus, CASE @ExecutionStatus WHEN 'Running' THEN 'In Progress' ELSE @ExecutionResult END, @ExecutionMessage, GETDATE() -- Set Output Parameter as the last Identity created to be used for subsequent logging. SELECT @ExecutionID = CAST(SCOPE_IDENTITY() AS INT) END
在SSIS中调用该存储过程并将@ExecutionID输出参数绑定到SSIS变量时,出现错误:
Value does not fall within the expected range
改用结果集方式可正常运行,但需使用输出参数方案解决该问题。
关键排查与解决步骤
1. 确认SSIS变量的数据类型匹配
- 存储过程中
@ExecutionID是INT类型,对应的SSIS变量必须设置为Int32类型,不能用Int64或其他数值类型,否则会因类型不匹配触发范围错误。 - 检查变量的“数据类型”属性,确保选择
Int32。
2. 检查参数方向与名称配置
- 在SSIS的“执行SQL任务编辑器”→“参数映射”中,
@ExecutionID的方向必须设置为输出,不能误设为输入或输入输出。 - 若使用OLE DB连接管理器,参数需按定义顺序映射;若使用ADO.NET连接管理器,需确保参数名称完全匹配存储过程中的定义(格式为
@参数名)。
3. 验证存储过程输出参数的赋值逻辑
- 检查
log.T_LOG_Execution表的自增列数据类型:如果是BIGINT,需将存储过程中@ExecutionID改为BIGINT,同时SSIS变量改为Int64,避免数值超出INT范围。 - 单独执行存储过程测试输出参数是否正常返回:
确认返回的DECLARE @ExecID INT, @GUID UNIQUEIDENTIFIER = NEWID() EXEC [log].[SP_LogExecutionStep] @ExecutionGUID = @GUID, @ExecutionStatus = 'Running', @ExecutionID = @ExecID OUTPUT SELECT @ExecID@ExecID是合法的INT值。
4. 检查连接管理器的SQL语句格式
- 若使用OLE DB连接管理器,SQL语句需按参数顺序占位,输出参数末尾标注
OUTPUT:EXEC [log].[SP_LogExecutionStep] ?, ?, ?, ?, ?, ?, ?, ?, ?, ? OUTPUT - 若使用ADO.NET连接管理器,可直接使用命名参数调用,确保输出参数标注
OUTPUT:EXEC [log].[SP_LogExecutionStep] @ExecutionGUID = @ExecutionGUID, @ProjectName = @ProjectName, @PackageName = @PackageName, @PackageVersion = @PackageVersion, @ParentPackageName = @ParentPackageName, @ParentExecutionID = @ParentExecutionID, @ExecutionStatus = @ExecutionStatus, @ExecutionResult = @ExecutionResult, @ExecutionMessage = @ExecutionMessage, @ExecutionID = @ExecutionID OUTPUT
5. 确保参数映射顺序正确
- 所有参数的映射顺序必须和存储过程定义的参数顺序完全一致,包括可选参数(即使传入NULL),遗漏或顺序错误会导致输出参数绑定失败。
内容的提问来源于stack exchange,提问作者Hassan
相关产品推荐
相关产品推荐

