我有一个SQL Server Integration Services项目,它使用OLE DB源并将SQL命令作为数据访问模式查询SQL Server 2005数据库。
我正在尝试参数化我的SQL查询,但语法不是@PARAM,当我尝试使用?并单击参数时,会出现错误,表示“无法从SQL命令中提取参数”。
我正在做一些类似于
SELECT * FROM [dbo].[TabledValuedFunction] (?)
我有一个SQL Server Integration Services项目,它使用OLE DB源并将SQL命令作为数据访问模式查询SQL Server 2005数据库。
我正在尝试参数化我的SQL查询,但语法不是@PARAM,当我尝试使用?并单击参数时,会出现错误,表示“无法从SQL命令中提取参数”。
我正在做一些类似于
SELECT * FROM [dbo].[TabledValuedFunction] (?)
创建动态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变量。
看起来OLEDB连接没有提供SSIS所需的一切来确定参数数据类型等,因此它无法正确解析应该是什么(这是我猜测的)。正如错误消息所建议的那样,您可以使整个SQL命令来自变量。您需要一个字符串变量,在数据流之前设置。
我曾经遇到过这个问题,有些查询可以正常工作,而其他一些则会失败,这让我感到非常疯狂。对我来说解决方法是删除 SELECT *,而是明确指定列名。在其他一些查询中,我不得不删除子查询。基本上,您必须调整/简化查询,直到 OLEDB 提供程序能够充分解析所有所需的信息以呈现参数信息。
为什么 OLEDB 提供程序不能返回更详细的错误消息,以便人们不必采用包变量解决方法????
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上测试通过。
您可以在OLE DB源中使用变量参数来提供动态表、动态条件语句或动态SQL语句。通过单击OLE DB源,您可以更改数据访问模式。以下是一些不同类型的访问模式的示例,您可以在其中使用包变量:
参数化表-使用表名或视图名变量。然后选择包含有效表名的变量名称;
参数化条件语句:使用SQL命令。SQL命令文本可能类似于:Select * From Table Where id = ?。然后映射您的变量。
变量中的动态SQL:使用变量中的SQL命令。然后将您的SQL语句放置在包字符串变量中:Select * From Table
我不完全确定您试图参数化什么,所以我向您介绍了一些可能有助于解决您特定问题的选项。希望这能帮到您。