2017-02-03 6 views
4
IF OBJECT_ID('tempdb..#TempList') IS NOT NULL 
    DROP TABLE #TempList 

CREATE TABLE #TempList (
    VarName NVARCHAR(10) , 
    VarValue NVARCHAR(10), 
    VarValueNext NVARCHAR(10) 
) 
INSERT INTO #TempList 
    VALUES ('Fred',NULL, NULL), 
      ('Wilma',NULL, NULL), 
      ('Barney',NULL, NULL), 
      ('Betty',NULL, NULL) 

;WITH cte_name AS (
SELECT * 
    FROM #TempList 
) 

UPDATE cte_name 
    SET cte_name.VarValue = 'Fred' WHERE cte_name.VarName = 'Wilma' OR cte_name.VarName = 'Barney' 
--  , cte_name.VarValueNext = 'Pebbles' WHERE cte_name.VarValue = 'Fred' and cte_name.VarName = 'Wilma' 

SELECT * 
    FROM #TempList 

Я понимаю, что это простой пример, который не требует использования конструкции CTE. Я пытаюсь понять, как влияет блок UPDATE.WITH cte UPDATE SET с WHERE breaks

Я хотел бы установить значение количества полей. Как только я представляю предложение WHERE, кажется, я могу установить только одно значение.

Что я делаю неправильно?

Спасибо, Thys

+0

Что, кажется, проблема ?, это работает так же, как вы хотите, чтобы – Lamak

+1

Так как оператор обновления может иметь только один пункт, где. В этой ситуации, я думаю, вы хотели бы использовать выражение case. –

+1

@ Lamak они говорят о втором столбце в обновлении (который в настоящее время прокомментирован). –

ответ

3

Вы должны были бы использовать выражение случай здесь не где положение. Помните, что предложение where фильтрует строки в вашем запросе. Я думаю, вы немного смущены синтаксисом вещей. Вот как выглядит этот тип обновления.

UPDATE cte_name 
    SET VarValue = case when VarName IN('Wilma', 'Barney') then 'Fred' else VarName end 
     , VarValueNext = case when VarValue IN('Wilma', 'Barney') then 'Pebbles' else VarValueNext end 
+0

Да, спасибо. Цените помощь :) ... LOT путают, но благодаря этому форуму становится лучше! –

2

Если не ошибаюсь, вам нужно что-то вроде этого

UPDATE #TempList 
SET VarValue = CASE 
        WHEN VarName IN ('Wilma', 'Barney') THEN 'Fred' 
        ELSE VarValue 
        END, 
     VarValueNext = CASE 
         WHEN VarValue IN ('Fred', 'Wilma') THEN 'Pebbles' 
         ELSE VarValueNext 
         END 
WHERE VarName IN ('Wilma', 'Barney') 
     OR VarValue IN ('Fred', 'Wilma') 
+0

да, спасибо. Цените помощь. –

0

Шон Lange указал мою ошибку - один ИНЕКЕ в UPDATE, а не на SET.

Для полноты, вот рабочее решение.

Спасибо за помощь всем - высоко ценится. Через несколько дней ... ;-)

IF OBJECT_ID('tempdb..#TempList') IS NOT NULL 
    DROP TABLE #TempList 

CREATE TABLE #TempList (
    VarName NVARCHAR(10) , 
    VarValue NVARCHAR(10), 
    VarValueNext NVARCHAR(10) 
) 
INSERT INTO #TempList 
    VALUES ('Fred',NULL, NULL), 
      ('Wilma',NULL, NULL), 
      ('Barney',NULL, NULL), 
      ('Betty',NULL, NULL) 

;WITH cte_name AS (
SELECT * 
    FROM #TempList 
) 

UPDATE cte_name 
    SET cte_name.VarValue = 
       CASE 
        WHEN cte_name.VarName = 'Wilma' OR cte_name.VarName = 'Barney' 
        THEN 'Fred' 
       END 
     , cte_name.VarValueNext = 
       CASE 
        WHEN cte_name.VarName = 'Betty' OR cte_name.VarName = 'Wilma' 
        THEN 'Bosses' 
       END 
SELECT * 
    FROM #TempList 
Смежные вопросы