添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在使用Execute SQL Task控件执行存储过程的时候,SSIS把语句原封不动地传给provider, 结果就导致不同的 provider 需要不同的输入处理方式,这样就显得有点小混乱.这里总结了一些使用不同provider时调用带输出参数的存储过程是遇到的问题.

以下,我使用一个简单的带一个输出参数的存储过程来举例.

CREATE PROC intoutput
@value INT OUTPUT
AS
SELECT @value = 10

我想让Execute SQL Task 运行存储过程,并保存运行结果到包变量(varInt). 对不同的provider,你需要在Parameter Mapping 页面修改 SQLStatement 和 Paramenter Name字段的值.

OLE DB

SQL Statement: exec intoutput ? output
Parameter Name: 0

另外,需要设 BypassPrepare 为 True, 因为如果语句包含参数标记的话  SQL 将不能正确解析

1 – OLE DB General

2 – OLE DB Parameter Mapping

SQL Statement: {call intoutput (?)}
Parameter Name: 1

ODBC 要求的语句和其它的provider 很不一样,你需要使用 "call" 而不是 "exec", 然后用大括号{}把整个语句括起来,而且要注意参数序号从1开始

3 - ODBC General

4 - ODBC Parameter Mapping

SQL Statement: intoutput
Parameter Name:<parameter name>

ADO 只需要使用存储过程名, 并设 IsQueryStoredProcedure 属性为 true.  参数使用存储过程定义使用的参数名 (本例为 value)

5 - ADO General

6 - ADO Parameter Mapping

ADO.NET

SQL Statement: intoutput
Parameter Name:@<parameter name>

ADO.NET 和 ADO类似. 设 IsQueryStoredProcedure 为 True, Statement 设为要执行的存储过程名. 用存储过程定义使用的参数名做为Parameter 列的值 但是要带前缀@(本例为 "@value").

注意: Parameter mapping 貌似没有@也同样管用,但是我不确定是不是对所有provider都管用

7 - ADO.NET General

8 - ADO.NET Parameter Mapping

用Execute SQL Task执行存储过程因不同的provider处理语句的方式不同而变得不易操作,主要的区别在于SQLStatement参数和Paramenter Name 的值,下表总结了它们的区别 (假设名为'StoreProc'的存储过程带一个叫Para的输出参数):

For more info about the Execute SQL Task, you can check out the books online entry , and the nice overview of the task on SQLIS.com.

附上MSDN中 在执行 SQL 任务中使用参数和返回代码 的解释.