当尝试使用Oracle OLE DB提供程序输入带有参数的SQL查询时,出现以下错误:
Parameters cannot be extracted from the SQL command. The provider might not help to parse parameter information from the command. In that case, use the"SQL command from variable" access mode, in which the entire SQL command is stored in a variable.
ADDITIONAL INFORMATION:
Provider cannot derive parameter information and SetParameterInfo has not been called. (Microsoft OLE DB Provider for Oracle)
我尝试按照此处的建议进行操作,但不太了解所需的内容:针对Oracle的参数化查询
有什么想法吗?
扩展问题中给出的链接:
创建一个包变量
双击包变量名。 (这使您可以访问变量的属性)
将属性\\'EvaluateAsExpression \\'设置为true
在表达式构建器中输入查询。
将OLE DB源查询设置为来自变量的SQL命令
表达式构建器可以使用变量动态创建表达式以创建"参数化查询"。
因此,以下\\'normal \\'查询:
1
| select * from book where book.BOOK_ID = ? |
可以在表达式生成器中编写为:
1
| "select * from book where book.BOOK_ID =" + @[User::BookID] |
然后可以使用表达式生成器进行空处理和数据转换。
在我的情况下,问题是我在SQL中以/ * * /的正常形式进行了注释,并且我也将列别名称为" Column name ",而不是[Column Name]。
一旦我删除了它们,它就会起作用。
还要尝试使用您的参数吗? WHERE子句(而不是JOINS)中的语句,这也是问题的一部分。
如果您使用数据流任务并使用OLE DB源,并且需要参数化查询:
创建变量以保存查询语句的" Full ":右键单击包外部的空白区域-并单击Variables:
在"变量"窗口中单击"添加变量":
命名为SQL_DTFLOW_FULL或您可以轻松理解的名称。 variable data type是STRING
创建变量以保存您的参数。
即完整的查询语句为:
1
| 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注入的影响。 (使用开发人员的直觉)
打开数据流任务,双击该项目,打开OLE DB源编辑器。
-
选择数据访问模式:SQL Command From Variable
-
选择变量名称:SQL_DTFLOW_FULL
-
单击预览以确保它可以工作。
仅此而已,这就是防止这种SSIS故障的方法。因为我使用这种方式,所以我从来没有遇到过这个问题,您知道,SSIS有点奇怪。
要更改变量值,请在"数据流任务"之前进行设置,每次更改变量值时,SQL_DTFLOW_FULL变量的SQL结果都会更改。