【问题标题】:Declare scalar variable SQL声明标量变量 SQL
【发布时间】:2015-05-04 07:23:39
【问题描述】:

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

 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(@listStr)

【问题讨论】:

  • 你不能用它作为子查询吗
  • @sri 子查询是什么意思?
  • 就像Gordon 在他的回答中使用了in (SELECT int_guid FROM ex_in)。了解更多here
  • 我不想从表中选择所有 int_guid 值。

标签: sql sql-server variables declare scalar


【解决方案1】:

不,因为字符串变量上的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) 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);

【讨论】:

  • 所以我无法将变量@listStr 用于int_guid 吗?列表会很快改变,所以重要的是它不会在 int_action 上改变
  • 使用@listStr 的唯一方法是使用动态SQL 构建一个字符串,然后执行整个字符串...
【解决方案2】:

我能想到的唯一方法是使用动态 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多