我有一个SQL Server Integration Services项目,该项目使用带有SQL命令的OLE DB源作为数据访问模式查询SQL Server 2005数据库。
我正在尝试参数化我的SQL查询,但语法不是@PARAM,当我尝试使用时?并单击参数我收到一条错误,指出“无法从SQL命令中提取参数。”
我正在做类似
的事情SELECT * FROM [dbo].[TabledValuedFunction] (?)
答案 0 :(得分:7)
创建动态SQL语句时,我使用表达式的运气好得多。所以在这个假设的情况下,我会创建2个变量Qry1和Qry1Param1。
在Qry1变量中,我会使用表达式编辑器来创建看起来像
的东西"SELECT * FROM [dbo].[TabledValuedFunction] where tbl_key = " + @[User::Qry1Param1]
Qry1Param1变量类似于1
。
使Qry1评估为
SELECT * FROM [dbo].[TabledValuedFunction] where tbl_key = 1
然后,您可以更改OLEDB数据源以使用来自变量的SQL命令的数据访问模式,并输入User :: Qry1变量。
答案 1 :(得分:1)
看起来OLEDB连接没有为SSIS提供确定参数数据类型等所需的所有内容,因此它无法正确解析它应该是什么(这是我的猜想)。正如错误消息所示,您可以使整个SQL命令来自变量。您需要一个在数据流之前设置的字符串变量。
答案 2 :(得分:1)
我遇到了这个问题,这让我很生气,一些查询会起作用,而其他查询会失败。我的解决方案是删除SELECT *,而是明确指定列。在其他一些查询中,我不得不删除子查询。基本上,您必须弄乱/简化您的查询,直到OLEDB提供程序能够充分解析呈现参数信息所需的所有信息。
为什么OLEDB提供程序无法返回更具描述性的错误消息,因此人们不必诉诸程序包变量解决方法????
答案 3 :(得分:0)
您可以在ole db源中使用变量参数来提供动态表,动态条件语句或动态sql语句。通过单击ole db源,您可以更改数据访问模式。下面是一些不同类型的访问模式的示例,您可以在其中使用包变量:
参数化表 - 使用表名或视图名变量。然后选择包含有效表名的变量名称;
参数化条件语句:使用sql命令。 Sql Command文本类似于:Select * From Table where id = ?.然后映射你的变量。
变量中的动态sql:使用变量中的sql命令。然后,您可以将sql语句放在包字符串变量中:选择* From Table
我并不完全确定你试图参数化的是什么,所以我给你一些可能的选项,这可能/可能无法帮助你解决你的特定问题。我希望这会有所帮助。
答案 4 :(得分:0)
您是如何设置执行sql任务组件的? 我刚试过,它运作正常。
这是我使用的功能:
create function test1(@x int)
returns @tbl table (x int)
as begin
while ( @x > 0 )
begin
insert @tbl values(@x);
set @x-=1;
end;
return;
end;
go
在MSSQL2008上测试,SSIS2008。