使用 Oracle OLE DB 提供程序时如何解决 SQL 查询参数映射问题?
题
当尝试使用 Oracle OLE DB 提供程序输入带参数的 SQL 查询时,出现以下错误:
无法从 SQL 命令中提取参数。提供程序可能无法帮助解析命令中的参数信息。在这种情况下,请使用“来自变量的 SQL 命令”访问模式,其中整个 SQL 命令存储在变量中。
附加信息:
提供程序无法导出参数信息,并且尚未调用 SetParameterInfo。(适用于 Oracle 的 Microsoft OLE DB 提供程序)
我已尝试遵循此处的建议,但不太明白需要什么:针对 Oracle 的参数化查询
有任何想法吗?
解决方案
要扩展问题中给出的链接:
- 创建包变量
- 双击包变量名称。(这允许您访问变量的属性)
- 将属性“EvaluateAsExpression”设置为 true
- 在表达式生成器中输入查询。
- 将 OLE DB 源查询设置为来自变量的 SQL 命令
表达式生成器可以使用变量动态创建表达式来创建“参数化查询”。
因此以下“正常”查询:
select * from book where book.BOOK_ID = ?
可以在表达式生成器中写为:
"select * from book where book.BOOK_ID = " + @[User::BookID]
然后,您可以使用表达式生成器进行空处理和数据转换。
其他提示
如果您使用数据流任务并使用 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 注入的影响。(利用你的开发者直觉)
- 打开数据流任务,双击该项目打开 OLE DB 源编辑器。
- 选择数据访问模式:
SQL Command From Variable
- 选择变量名称:
SQL_DTFLOW_FULL
- 单击“预览”以确保其有效。
这就是我防止 SSIS 失败的方法。自从我使用这种方式以来,我从未遇到过这个问题,你知道,SSIS 有些东西很奇怪。
要更改变量值,请在数据流任务之前设置它,即 SQL 结果 SQL_DTFLOW_FULL
每次更改变量值时,变量都会更改。
就我而言,问题是我在 sql 中以 /* */ 的正常形式进行注释,并且我还将列别名设置为“列名称”而不是 [列名称]。
一旦我删除它们,它就可以工作了。
还尝试有你的参数?语句在 WHERE 子句中而不是在 JOINS 中,这也是问题的一部分。