我需要你的帮助, 我阅读了论坛,但我仍然有一个没有解决方案的持续性问题。我想将变量传递给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,它返回了完全错误的好价值。
有关此问题的任何线索?
非常感谢你:)
罗宾
答案 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