EXEC sp_executesql未传递参数

时间:2015-05-06 12:19:51

标签: sql-server tsql

我需要你的帮助, 我阅读了论坛,但我仍然有一个没有解决方案的持续性问题。我想将变量传递给SP_EXECUTESQL的参数,但传递的变量的结果值在我的SQL语句中始终为ZERO。

这是我的代码:

declare @counter int
declare @sql nvarchar(max)

// ------ My @COUNTER value I want to get, it's ok

SET @counter = (
        select COUNT(CREATED_DT)
        from USERS
        where CAST(CREATED_DT as date) = CAST(@DATE_TIME as date)
)

// ------ I try to pass my @COUNTER value for my COUNTER_COLUMN, and it's not ok anymore...

SET @sql = N'update DATA_REPORT set COUNTER_COLUMN = @counterB';
EXEC sp_executesql @sql, N'@counterB int', @counterB = @counter;

我没有执行错误但在我的SQL中始终存在: COUNTER_COLUMN = 0 !!!

我之前检查过我的@counter没有返回0,它返回了完全错误的好价值。

有关此问题的任何线索?
非常感谢你:) 罗宾

4 个答案:

答案 0 :(得分:0)

你试过这个:

declare @sql nvarchar(max)

SET @sql = N'update myTable set avg =   (
                                        select COUNT(CREATED_DT)
                                        from USERS
                                        where CAST(CREATED_DT as date) = CAST(@DATE_TIME as date)
                                        )';
EXEC sp_executesql @sql

答案 1 :(得分:0)

大大简化了这一点,以删除它想要的类似的不必要的动态SQL。

update DATA_REPORT 
set COUNTER_COLUMN = 
(
    select COUNT(CREATED_DT)
    from USERS
    where CAST(CREATED_DT as date) = CAST(@DATE_TIME as date)
)

答案 2 :(得分:0)

从您的查询中,我尝试使用' concat'参数而不是使用@counterB,它工作得很好。

declare @sql nvarchar(max)
declare @counter int = 1
set @sql = concat(N'update DATA_REPORT set COUNTER_COLUMN = ', @counter);
exec sp_executesql @sql

@sql看起来像这样

update DATA_REPORT set COUNTER_COLUMN = 1

答案 3 :(得分:0)

感谢大家,

你的答案非常有趣,帮助我以不同的方式思考并解决了我的问题。我选择使用sp_executesql在没有@parameters的情况下尽可能简单地执行我的语句。它使我的变量类型出现问题。

PS。 @Rawitas Krungkaew>我没有尝试过CONCAT,但要牢记这一点,谢谢。

   declare @dyn_col_account varchar(40);
   declare @DATE_TIME nvarchar(50)

   SET @counter = (
            select COUNT(CREATED_DT)
            from USERS
            where CAST(CREATED_DT as date) = CAST(@DATE_TIME as date)
    )
    DECLARE @query1 nvarchar(max) = '
            UPDATE DATA_REPORT 
            SET ['+@dyn_col_account+'] = '+ @counter +' 
            WHERE TIME_DAY=cast('''+@DATE_TIME+''' as date)' 

    EXECUTE sp_executesql @query1