Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决使用Oracle OLE DB提供程序时的SQL查询参数映射问题?_Oracle_Ssis - Fatal编程技术网

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

如何解决使用Oracle OLE DB提供程序时的SQL查询参数映射问题?,oracle,ssis,Oracle,Ssis,当尝试使用Oracle OLE DB提供程序输入带有参数的SQL查询时,出现以下错误: 无法从SQL命令中提取参数。提供程序可能无法帮助解析命令中的参数信息。在这种情况下,请使用“来自变量的SQL命令”访问模式,其中整个SQL命令存储在一个变量中。 其他信息: 提供程序无法派生参数信息,并且尚未调用SetParameterInfo。(用于Oracle的Microsoft OLE DB提供程序) 我在这里尝试了以下建议,但不太明白需要什么: 有什么想法吗?要扩展问题中给出的链接: 创建一个包变量

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

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

我在这里尝试了以下建议,但不太明白需要什么:


有什么想法吗?

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

  • 创建一个包变量
  • 双击包变量名。(这允许您访问变量的属性)
  • 将属性“EvaluatesExpression”设置为true
  • 在表达式生成器中输入查询
  • 从变量将OLE DB源查询设置为SQL命令
  • 表达式生成器可以使用变量动态创建表达式,以创建“参数化查询”。
    因此,以下“正常”查询:

    select * from book where book.BOOK_ID = ?
    
    可以在表达式生成器中编写为:

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

    然后,您可以使用expression builder执行null处理和数据转换。

    如果您使用data Flow Task和OLE DB Source,并且需要参数化查询:

  • 创建变量以保存查询语句的“完整”:右键单击包外的空白区域,然后单击变量:
  • 单击变量窗口上的添加变量:

    将名称命名为
    SQL\u DTFLOW\u FULL
    或您可以轻松理解的名称。
    变量数据类型是
    字符串

  • 创建变量以保存参数 i、 e、查询语句的完整性为:

    SELECT * FROM BOOK WHERE BOOK_ID = @BookID --@BookID is SQL Parameter
    
    在上面的示例中,我只有一个参数:@BookID,所以我需要创建一个变量来保存我的参数。根据您的查询添加更多变量

    给它命名
    SQL\u DTFLOW\u BOOKID

    变量数据类型是
    字符串

    因此,您需要使SSI整洁,并将变量按可理解的部分进行排序

    尝试使变量名为
    SQL{TASK name}{VariableName}

  • SQL\u DTFLOW\u FULL
    变量创建表达式,单击数字1,然后开始填充数字2。使用字符串块使SQL语句成为正确的SQL语句。字符串块通常在开头和结尾使用“双引号”。用字符串块连接变量
  • 单击“计算表达式”以显示结果,若要确保您的查询是正确的,请将查询结果复制粘贴到SSMS

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

  • 打开数据流任务,双击该项打开OLE DB源代码编辑器
    • 选择数据访问模式:
      SQL命令From Variable
    • 选择变量名:
      SQL\u DTFLOW\u FULL
    • 单击“预览”以确保其正常工作
    这就是我防止SSIS失败的全部方法。因为我用这种方式,我从来没有遇到过这个问题,你知道,SSIS有些奇怪


    要更改变量值,请在执行数据流任务之前进行设置,每次更改变量值时,
    SQL\u DTFLOW\u FULL
    变量的SQL结果都会更改

    在我的例子中,问题是我在sql中有正常格式为/**/的注释,而且我还有列别名“column name”而不是[column name]

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


    是否也尝试使用您的参数?WHERE子句中的语句,而不是联接中的语句,这也是问题的一部分。

    如果使用字符串变量,则需要用单引号将其括起来“select*from book WHERE book.book_AUTHER=”+@[User::AuthorName]+“”