尝试在OLE DB源任务中调用proc时遇到令人沮丧的问题。我正在从变量数据访问模式使用SQL命令,但可以看到它无法正确评估我的变量。
我的变量(ValidateAsExpression设置为True)使用表达式创建一个SQL命令,例如“ EXEC ProcName‘Param'”,其中Param的值来自我使用EXEC SQL任务设置的变量。下面是表达式:
“EXEC ProcName ” + “‘” + @[User::vDateThreshold] + “‘”
如果我在源中使用了引用静态值的变量,则它可以正常工作,但是问题似乎出在我使用在表达式中引用另一个变量的变量时。
还有其他人遇到这个问题吗?
我使用这种方法是因为尝试将参数与sql命令数据访问方法一起使用时遇到类似的问题。
预先感谢
答案 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的值设置得较早时,便分配了正确的日期值。
我认为这是一个长时间观察的事情,我错过了明显的事情。