数据流问题中的OLE DB源变量

时间:2019-04-18 05:39:51

标签: sql-server ssis oledb etl

尝试在OLE DB源任务中调用proc时遇到令人沮丧的问题。我正在从变量数据访问模式使用SQL命令,但可以看到它无法正确评估我的变量。

我的变量(ValidateAsExpression设置为True)使用表达式创建一个SQL命令,例如“ EXEC ProcName‘Param'”,其中Param的值来自我使用EXEC SQL任务设置的变量。下面是表达式:

“EXEC ProcName ” + “‘” + @[User::vDateThreshold] + “‘”

如果我在源中使用了引用静态值的变量,则它可以正常工作,但是问题似乎出在我使用在表达式中引用另一个变量的变量时。

还有其他人遇到这个问题吗?

我使用这种方法是因为尝试将参数与sql命令数据访问方法一起使用时遇到类似的问题。

预先感谢

3 个答案:

答案 0 :(得分:2)

  

我使用这种方法是因为尝试将参数与sql命令数据访问方法一起使用时遇到类似的问题。

正确的方法是使用带有参数的SQL Command:

EXEC ProcName ?

然后选择@[User::vDateThreshold]作为参数。

如果它不起作用,请检查您的过程代码,并确保它生成特定的结果集。如果结果集是动态的并且列不是固定的,则必须在查询中使用WITH RESULTSETS关键字定义它。

答案 1 :(得分:0)

@[User::vDateThreshold的名称来看,它似乎是一个SSIS日期时间变量。尝试使用显式强制转换将其设置为变量,然后使用该变量执行存储过程。确保在'函数中包含单引号(CAST),如果在SSMS中完成,则使用单引号。在SSIS中将日期时间变量串联在字符串变量中时,必须将日期时间变量转换为文本,这是通过下面的示例表达式中的(DT_STR, length, codepage)完成的。我不确定您使用的是哪个版本,但是在SSDT for Visual 2017上进行测试对我来说效果很好。如果您仍然希望将SQL保留在变量中,则将进行介绍,但是如果您希望采用这种方法,@ Hadi发布的解决方案是一个不错的选择。

"DECLARE @pDate DATETIME
SET @pDate =  CAST('" + (DT_STR, 50, 1252)@[User::vDateThreshold]  + "' AS DATETIME)
EXEC ProcName @pDate"

答案 2 :(得分:0)

感谢您对我的问题的答复。

我实际上发现问题在于我的任务在包装中的顺序。当我在exec SQL任务上使用断点仔细查看分配给相关变量的值时,我可以看到错误的日期传递给了proc。当我将vDateThreshold的值设置得较早时,便分配了正确的日期值。

我认为这是一个长时间观察的事情,我错过了明显的事情。