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

时间:2008-09-12 09:12:57

标签: oracle ssis

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

  

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

我尝试过遵循此处的建议,但不太明白需要什么:Parameterized queries against Oracle

有什么想法吗?

3 个答案:

答案 0 :(得分:18)

扩展问题中给出的链接:

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

    表达式构建器可以使用变量动态创建表达式来创建“参数化查询” 所以下面的'普通'查询:

    select * from book where book.BOOK_ID = ?
    

    可以在表达式构建器中编写为:

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

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

答案 1 :(得分:1)

如果您使用数据流任务并使用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_DTFLOW_FULL变量的SQL结果都会更改。

答案 2 :(得分:1)

在我的情况下,问题是我在sql内以/ * * /的常规格式进行了注释,并且我也将列别名作为“列名”而不是[列名]。

一旦我删除了它们,它就会起作用。

还要尝试使用您的参数吗? WHERE子句(而不是JOINS)中的语句,这也是问题的一部分。