SQL Server Integration Services - 向SQL语句添加参数

时间:2010-01-13 14:52:34

标签: sql-server ssis

我有一个SQL Server Integration Services项目,该项目使用带有SQL命令的OLE DB源作为数据访问模式查询SQL Server 2005数据库。

我正在尝试参数化我的SQL查询,但语法不是@PARAM,当我尝试使用时?并单击参数我收到一条错误,指出“无法从SQL命令中提取参数。”

我正在做类似

的事情
SELECT * FROM [dbo].[TabledValuedFunction] (?)

5 个答案:

答案 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

This is my ExecSql setting.

在MSSQL2008上测试,SSIS2008。