使用 Oracle OLE DB 提供程序时如何解决 SQL 查询参数映射问题?

StackOverflow https://stackoverflow.com/questions/58540

  •  09-06-2019
  •  | 
  •  

当尝试使用 Oracle OLE DB 提供程序输入带参数的 SQL 查询时,出现以下错误:

无法从 SQL 命令中提取参数。提供程序可能无法帮助解析命令中的参数信息。在这种情况下,请使用“来自变量的 SQL 命令”访问模式,其中整个 SQL 命令存储在变量中。
附加信息:
提供程序无法导出参数信息,并且尚未调用 SetParameterInfo。(适用于 Oracle 的 Microsoft OLE DB 提供程序)

我已尝试遵循此处的建议,但不太明白需要什么:针对 Oracle 的参数化查询

有任何想法吗?

有帮助吗?

解决方案

要扩展问题中给出的链接:

  1. 创建包变量
  2. 双击包变量名称。(这允许您访问变量的属性)
  3. 将属性“EvaluateAsExpression”设置为 true
  4. 在表达式生成器中输入查询。
  5. 将 OLE DB 源查询设置为来自变量的 SQL 命令

表达式生成器可以使用变量动态创建表达式来创建“参数化查询”。
因此以下“正常”查询:

select * from book where book.BOOK_ID = ?

可以在表达式生成器中写为:

"select * from book where book.BOOK_ID = " + @[User::BookID]

然后,您可以使用表达式生成器进行空处理和数据转换。

其他提示

如果您使用数据流任务并使用 OLE DB 源,并且您需要参数化您的查询:

  1. 创建变量来保存“完整”查询语句:右键单击包外部的空白区域 - 然后单击变量:

Variables

单击变量窗口上的添加变量:

enter image description here

使名称为 SQL_DTFLOW_FULL 或者你可以轻松理解的东西。这 variable data typeSTRING

  1. 创建变量来保存您的参数。

即,完整的查询语句是:

SELECT * FROM BOOK WHERE BOOK_ID = @BookID --@BookID is SQL Parameter

在上面的示例中,我只有一个参数:@BookID,所以我需要创建一个变量来保存我的参数。添加更多变量取决于您的查询。

ParamAdd

给它起个名字 SQL_DTFLOW_BOOKID

variable data typeSTRING

因此,您需要使您的 SSIS 整洁,并将变量排序为易于理解的部分。

尝试使变量名称为 SQL_{TASK NAME}_{VariableName}

  1. 表达为 SQL_DTFLOW_FULL 变量,单击数字 1,然后开始填充数字 2。使用字符串块使您的 SQL 语句成为正确的 SQL 语句。字符串块通常在开头和结尾使用“双引号”。将变量与字符串块连接起来。

Expression

单击评估表达式,显示结果,以确保您的查询正确,将查询结果复制粘贴到 SSMS。

使用您自己的逻辑自行确保变量不受 SQL 注入的影响。(利用你的开发者直觉)

  1. 打开数据流任务,双击该项目打开 OLE DB 源编辑器。

Data Flow

  • 选择数据访问模式: SQL Command From Variable
  • 选择变量名称: SQL_DTFLOW_FULL
  • 单击“预览”以确保其有效。

这就是我防止 SSIS 失败的方法。自从我使用这种方式以来,我从未遇到过这个问题,你知道,SSIS 有些东西很奇怪。

要更改变量值,请在数据流任务之前设置它,即 SQL 结果 SQL_DTFLOW_FULL 每次更改变量值时,变量都会更改。

就我而言,问题是我在 sql 中以 /* */ 的正常形式进行注释,并且我还将列别名设置为“列名称”而不是 [列名称]。

一旦我删除它们,它就可以工作了。

还尝试有你的参数?语句在 WHERE 子句中而不是在 JOINS 中,这也是问题的一部分。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top