2015-03-03 3 views
-2

Моя проблема в том, что я хочу использовать эту локальную переменную внутри моего запроса на обновление, есть ли способ сделать это?Объявить скалярную переменную SQL

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) 
+0

Не можете использовать его в качестве суб запроса – Ram

+0

@sri Что вы подразумеваете под подзапросом? – Girre

+0

Как [Гордон] (http://stackoverflow.com/a/28835333/2246380) использовал в своем ответе 'in (SELECT int_guid FROM ex_in)'. Подробнее [здесь] (https://technet.microsoft.com/en-us/library/ms189575%28v=sql.105%29.aspx) – Ram

ответ

0

Единственный способ сделать то, что вы хотите, что я могу думать использует динамический 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; 
0

Нет, потому что 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); 
+0

Итак, я не могу использовать эту переменную @listStr для int_guid в? Список будет меняться очень быстро, поэтому его важно не менять только на int_action. – Girre

+0

Единственный способ использовать @listStr - построить строку с динамическим SQL, а затем выполнить всю цепочку ... – pmbAustin

Смежные вопросы