SSIS 执行 SQL 查询任务找不到存储过程
Posted
技术标签:
【中文标题】SSIS 执行 SQL 查询任务找不到存储过程【英文标题】:SSIS Execute SQL Query task cannot find stored procedure 【发布时间】:2013-02-08 17:36:21 【问题描述】:我正在开发一个现有的 SSIS 包以向其中添加自定义日志记录。我正在尝试对其进行测试,但我有一个未创建的执行 SQL 任务,但出现以下错误。
执行查询
“ap_pfl_DropProfileTables”
失败并出现以下错误:
“找不到存储过程 'ap_pfl_DropProfileTables'。”。 可能的失败原因:查询有问题,“ResultSet” 属性设置不正确,参数设置不正确,或 连接未正确建立。
我不知道为什么会收到此错误,因为:
-
我没有创建或更改它,这个包在生产中运行时没有错误。
存储过程只是截断两个表。它没有结果集或参数。
连接工作正常,因为此存储过程与另一个运行数据流任务的线程同时运行,该任务成功运行并使用此包中仅有的两个连接。
我已经对数据库进行了两次和三次检查,以确保存储过程存在并且拼写正确。我什至检查了存储过程中字母的大小写。
关于如何解决这个问题的任何想法?
【问题讨论】:
您确定您的连接字符串指向正确的位置吗? sproc 是否存在于给定的模式中?执行存储过程的帐户是否具有访问它的正确权限? 连接字符串很好,因为同时运行的数据流任务使用相同的连接,并且成功完成,没有错误。我正在使用系统管理员帐户,所以是的,它可以访问。存储过程是在dbo下创建的 参数是否随时更改和/或映射正确? 如果将查询更改为exec dbo.ap_pfl_DropProfileTables
会发生什么?
也许你的行为不端的连接中有一个表达式会被动态评估,这在 SSIS 设计表面上可能并不明显。一种确定检查的方法是使用 SQL Profiler 来监视您希望查询针对其执行的数据库,并验证它确实针对您期望的数据库运行。您可以做的其他事情是从 SSIS XML 中提取连接并直观地比较它们,看看是否有任何不同。
【参考方案1】:
是的,这令人沮丧 - 但可行。关键是不要使用 ADO.NET 连接管理器,而是使用老式的 ADO 连接管理器。第二个关键是不要在执行 SQL 任务编辑器的 SQLStatement 属性中使用 EXEC 或 EXECUTE。只需输入存储过程的名称(也可以使用 3 部分名称约定 database.schema.storedprocedure。)
我还没有在存储过程中使用参数尝试过这个。此外,我还没有尝试过使用 OLE DB 连接管理器。
【讨论】:
【参考方案2】:我知道这是一个旧线程,但我在 SQL 2008 R2 上使用 SSIS 时遇到了这个问题。
对于使用 ADO.NET 连接的我,我实际上必须将 IsQueryStoredProcedure
设置为 False
,然后错误就消失了。我是否使用EXEC
并不重要。
【讨论】:
【参考方案3】:我自己遇到了这个问题,这就是我所做的(使用 ADO.NET 连接)
在 SQLStatement 字段中,我输入了存储过程的名称 (dbo.myStoredProc)。 然后我将 IsQueryStoredProcedure 属性设置为“True”
我在想,当 IsQueryStoredProcedure 设置为 true 时,对象会自动在 EXEC 前面添加以识别该命令是存储过程调用。
【讨论】:
【参考方案4】:在遇到同样的问题后,我对此进行了一些调查:
具体我的情况是:
-
我需要使用 ADO.Net,因为我运行的是 SQL Azure
我要捕获存储过程返回值
首先我尝试了这个:
在 SQLStatement 中我输入了 proc 名称(不带 EXEC)
myschema.MyProc;
在 IsQueryStoredProcedure 我把 False
在 ResultSet 我把 None
在 Parameter Mapping 标签中我放了
Variable Name Direction Data Type Parameter Name Parameter Size
User::MyVariable ReturnValue Int32 0 -1
这运行没有错误,但不捕获返回值。
我假设如果您将 IsQueryStoredProcedure 设置为 true,它应该正确连接所有这些。但它会返回一个错误。
这个https://technet.microsoft.com/en-us/library/cc280502(v=sql.110).aspx 表示在使用 ADO.Net 时捕获返回值“Set IsQueryStoreProcedure 设置为 True”。但它返回的错误是 OP
作为一种解决方法,我这样做了:
DECLARE @R INT
EXEC @R = MySchema.MyProc;
SELECT @R
我离开 IsQueryStoredProcedure 为 False
我将 ResultSet 设置为单行
我删除了参数映射,而是映射了一个结果集:
Result Name Variable Name
0 User::MyVariable
【讨论】:
以上是关于SSIS 执行 SQL 查询任务找不到存储过程的主要内容,如果未能解决你的问题,请参考以下文章
如果存储过程失败,则在执行 SQL 任务中将输出变量值获取到 ssis 变量中