尝试使用Oracle OLE DB提供程序输入带有参数的SQL查询时,出现以下错误:
无法从SQL命令中提取参数。提供程序可能无法帮助解析命令中的参数信息。在这种情况下,使用“来自变量的SQL命令”访问模式,其中整个SQL命令存储在变量中 其他信息:
Provider无法派生参数信息,也未调用SetParameterInfo。 (Microsoft OLE DB Provider for Oracle)
我尝试过遵循此处的建议,但不太明白需要什么:Parameterized queries against Oracle
有什么想法吗?
答案 0 :(得分:18)
扩展问题中给出的链接:
表达式构建器可以使用变量动态创建表达式来创建“参数化查询” 所以下面的'普通'查询:
select * from book where book.BOOK_ID = ?
可以在表达式构建器中编写为:
"select * from book where book.BOOK_ID = " + @[User::BookID]
然后,您可以使用表达式构建器执行空值处理和数据转换。
答案 1 :(得分:1)
如果您使用数据流任务并使用OLE DB源,并且需要参数化查询:
在“变量”窗口中单击“添加变量”:
命名为SQL_DTFLOW_FULL
或您容易理解的名称。 variable data type
是STRING
即,查询语句的全部内容是:
SELECT * FROM BOOK WHERE BOOK_ID = @BookID --@BookID is SQL Parameter
在上面的示例中,我只有一个参数:@BookID,因此我需要创建一个变量来保存我的参数。添加更多变量取决于您的查询。
命名为SQL_DTFLOW_BOOKID
variable data type
是STRING
因此,您需要使SSIS变得整洁,并将变量按可理解的部分进行排序。
尝试使变量名称为SQL_{TASK NAME}_{VariableName}
SQL_DTFLOW_FULL
变量创建表达式,单击数字1,然后开始填充数字2。使用字符串块使SQL语句成为正确的SQL语句。字符串块通常在开头和结尾使用“双引号”。用字符串块连接变量。单击评估表达式以显示结果,以确保查询正确,然后将查询结果粘贴到SSMS。
使用自己的逻辑自行确保变量不受SQL注入的影响。 (使用开发人员的直觉)
SQL Command From Variable
SQL_DTFLOW_FULL
仅此而已,这就是防止这种SSIS故障的方法。由于我使用这种方式,所以我从来没有遇到过这个问题,您知道,SSIS有点奇怪。
要更改变量值,请在“数据流任务”之前进行设置,每次更改变量值后,SQL_DTFLOW_FULL
变量的SQL结果都会更改。
答案 2 :(得分:1)
在我的情况下,问题是我在sql内以/ * * /的常规格式进行了注释,并且我也将列别名作为“列名”而不是[列名]。
一旦我删除了它们,它就会起作用。
还要尝试使用您的参数吗? WHERE子句(而不是JOINS)中的语句,这也是问题的一部分。