声明标量变量SQL

声明标量变量SQL,sql,sql-server,variables,declare,scalar,Sql,Sql Server,Variables,Declare,Scalar,我的问题是我想在我的更新查询中使用这个局部变量,有没有办法做到这一点 DECLARE @listStr VARCHAR(MAX) SELECT @listStr = COALESCE(@listStr+''',''' , '') + cast(int_guid as varchar(max)) FROM ex_in SELECT '''' + @listStr + '''' 更新查询 不,因为在一个字符串变量上的输入并没有达到您期望的效果 但是,为什么要为变量而烦恼

我的问题是我想在我的更新查询中使用这个局部变量,有没有办法做到这一点

 DECLARE @listStr VARCHAR(MAX)
    SELECT @listStr = COALESCE(@listStr+''',''' , '') + cast(int_guid as varchar(max)) 
    FROM ex_in
    SELECT '''' + @listStr + ''''
更新查询

不,因为在一个字符串变量上的输入并没有达到您期望的效果

但是,为什么要为变量而烦恼呢?只要做:

update dbo.ex_in
    SET int_action = (CASE WHEN int_action = 120 THEN 110 WHEN int_action = 220 THEN 210 ELSE int_action END)
    WHERE int_action IN (120, 220) AND
          int_guid in (SELECT int_guid FROM ex_in);
当然,既然我写了这篇文章,in逻辑就没有必要了,因为两个查询都在同一个表上,并且没有过滤。只需使用:

update dbo.ex_in
    SET int_action = (CASE WHEN int_action = 120 THEN 110 WHEN int_action = 220 THEN 210 ELSE int_action END)
    WHERE int_action IN (120, 220);

我能想到的做您想做的事情的唯一方法是使用动态SQL,如下所示:

DECLARE @sql varchar(MAX);

SET @sql = '
UPDATE dbo.ex_in
SET    int_action = CASE WHEN int_action = 120 THEN 110 
                         WHEN int_action = 220 THEN 210 
                         ELSE int_action 
                    END;
WHERE  int_action IN (120,220)
       AND int_guid IN (' + @listStr + ')
';

EXEC @sql;

你不能把它当作潜艇吗query@sri你所说的子查询是什么意思?Like在他的答案中使用了SELECT int\u guid FROM ex\u in。了解更多信息我不想从表中选择所有int\u guid值。因此我无法在中使用该变量@listStr作为int\u guid?列表的变化会非常快,所以重要的是它不会只在int_action上变化使用@listStr的唯一方法是使用动态SQL构建一个字符串,然后执行整个字符串。。。
DECLARE @sql varchar(MAX);

SET @sql = '
UPDATE dbo.ex_in
SET    int_action = CASE WHEN int_action = 120 THEN 110 
                         WHEN int_action = 220 THEN 210 
                         ELSE int_action 
                    END;
WHERE  int_action IN (120,220)
       AND int_guid IN (' + @listStr + ')
';

EXEC @sql;