SQL Server Integration Services - 在SQL语句中添加参数

3

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

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

我正在做一些类似于

SELECT * FROM [dbo].[TabledValuedFunction] (?)
5个回答

7

创建动态SQL语句时,我发现使用表达式更为有效。因此,在这个假设的情况下,我会创建两个变量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

看起来OLEDB连接没有提供SSIS所需的一切来确定参数数据类型等,因此它无法正确解析应该是什么(这是我猜测的)。正如错误消息所建议的那样,您可以使整个SQL命令来自变量。您需要一个字符串变量,在数据流之前设置。


你知道我是否使用DataReader源会更有好运吗? - AJM
我也有同样的想法,尝试使用DataReader,但根本无法使用参数。不过如果我找到更好的解决方法,我会告诉你的。 - Tom H

1

我曾经遇到过这个问题,有些查询可以正常工作,而其他一些则会失败,这让我感到非常疯狂。对我来说解决方法是删除 SELECT *,而是明确指定列名。在其他一些查询中,我不得不删除子查询。基本上,您必须调整/简化查询,直到 OLEDB 提供程序能够充分解析所有所需的信息以呈现参数信息。

为什么 OLEDB 提供程序不能返回更详细的错误消息,以便人们不必采用包变量解决方法????


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

这是我的ExecSql设置。

在MSSQL2008、SSIS2008上测试通过。


0

您可以在OLE DB源中使用变量参数来提供动态表、动态条件语句或动态SQL语句。通过单击OLE DB源,您可以更改数据访问模式。以下是一些不同类型的访问模式的示例,您可以在其中使用包变量:

参数化表-使用表名或视图名变量。然后选择包含有效表名的变量名称;

参数化条件语句:使用SQL命令。SQL命令文本可能类似于:Select * From Table Where id = ?。然后映射您的变量。

变量中的动态SQL:使用变量中的SQL命令。然后将您的SQL语句放置在包字符串变量中:Select * From Table

我不完全确定您试图参数化什么,所以我向您介绍了一些可能有助于解决您特定问题的选项。希望这能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接