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