SSIS:将OLE DB源代码编辑器中的参数传递给表值函数

时间:2010-04-15 08:56:28

标签: sql-server-2005 ssis

如何在OLE DB Source中传递参数以调用表值函数,如:

  

从[dbo]中选择*。[udf_test](?,?)

这样做时,我收到错误:

无法从SQL命令中提取参数。提供程序可能无法帮助解析命令中的参数信息。在这种情况下,使用“SQL命令格式变量”访问模式,其中整个SQL命令存储在变量中。 语法错误,权限冲突或其他非特定错误(Microsoft SQL Native Client)

是否有另一种解决方案而不是“来自变量的SQL命令”?

斯文

2 个答案:

答案 0 :(得分:3)

您可以使用来自Variable的SQL Command,它相对简单。您可以使用脚本转换构建SQL语句以传递给Source,以编辑保存SQL的变量。因此,例如,您将设置一个名为strSQL的变量并将值设为

select * from [dbo].[udf_test](?1, ?2)

然后在脚本组件中,使用字符串操作方法将要传递的参数替换为?1和?2。

这是一个更多的工作包,但在我的经验中运作良好。

答案 1 :(得分:0)

这是一个变通方法,但效果很好。我们要做的是创建一个名为SetVar的存储过程,它将获取一个输入参数并将其分配给声明的out参数。

在OLE DB源数据库中创建一个名为SetVar的过程。它将@inputVar分配给@outVar

CREATE PROC SetVarInt
    @inputVar INT ,
    @outVar INT OUTPUT
AS
BEGIN
    SELECT @outVar = @inputVar;
END

在SSIS OLE DB源中使用此SQL:

DECLARE @param1 INT;

EXEC [dbo].[SetVarInt] @inputVar = ?, -- int
    @outVar = @param1 OUTPUT -- int

SELECT * FROM [dbo].[GetByKey](@param1)

如果没有任何反应,优化器可能已经优化了任务(检查包执行日志)。在这种情况下,我将以下内容添加到OLE DB源SQL的末尾,并将此输出连接到RowCount任务为虚拟变量。

SELECT 1 Done;