10

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

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

我已经尝试按照这里的建议,但不太明白需要什么:针对 Oracle 的参数化查询

有任何想法吗?

4

3 回答 3

18

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

  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]

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

于 2008-09-12T14:24:12.083 回答
1

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

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

变量

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

在此处输入图像描述

使名称是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}

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

表达

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

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

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

数据流

  • 选择数据访问模式:SQL Command From Variable
  • 选择变量名称:SQL_DTFLOW_FULL
  • 单击预览以确保其正常工作。

这就是我防止这种 SSIS 失败案例的全部方法。由于我使用这种方式,我从来没有遇到过这个问题,你知道,SSIS 有点奇怪。

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

于 2018-07-20T10:25:29.710 回答
1

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

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

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

于 2018-09-24T13:12:44.357 回答