2009-04-03 4 views
2

У меня есть таблица со столбцом, которую я хотел бы обновить. Ниже приведен пример кода TSQL:TSQL: обновить значения с помощью оператора With?

WITH Pieces(id, newdesc) AS 
(
SELECT itemid, REPLACE(REPLACE(description, 'DESC_A', 'DESC_B'), 'NEW_1', 'NEW_2') 
    FROM myTable 
    WHERE description like '%DESC_A%DESC_B%' 
) 
-- SELECT * FROM Pieces 
UPDATE myTable SET description = newdesc // not working, how? 

Это обновление НЕ работает. Комментируя SELECT, я вижу, что результат - это то, что мне нужно. Как я могу сделать это изменение в пакетном режиме для группы строк? Не уверен, что это возможно с помощью инструкции WITH?

Вот несколько примеров данных:

.... 
xxxDESC_AyyyDESC_Bwwww 
aaaDESC_AxxDESC_Beee 
.... 

в udpated из них будут:

.... 
xxxNEW_1yyyNEW_2wwww 
aaaNEW_1xxNEW_2eee 
.... 
+0

какая ошибка вы получаете? –

+0

Я мог бы определить переменную таблицы и вставить значение в оператор WITH, а затем выполнить цикл через myTable, чтобы выполнить обновление. Возможно ли это, используя инструкцию WITH? –

+0

Недопустимое имя столбца 'newdesc'. –

ответ

4

возможно

UPDATE myTable 
SET description = newdesc 
FROM Pieces 
WHERE Pieces.id = myTable.itemid 
+0

как его принять? Я не могу понять (не принимать ui). –

+0

Нажмите на отметку ниже под стрелкой вниз стрелки –

+0

Спасибо, Jhonny, хорошо провести выходные! –

2

Это должно делать то, что вы хотите. Вам здесь не нужно.

UPDATE myTable SET description=REPLACE(REPLACE(description, 'DESC_A', 'NEW_1'), 'DESC_B', 'NEW_2') 
WHERE description like '%DESC_A%' OR description like '%DESC_B%' 

Если оба из них никогда не находятся в одних и тех же полей, которые вы могли бы использовать два отдельных заявления для лучшего Mangement ресурсов в случае большой таблицы.

UPDATE myTable SET description=REPLACE(description, 'DESC_A', 'NEW_1') 
WHERE description like '%DESC_A%' 
go  
UPDATE myTable SET description=REPLACE(description, 'DESC_B', 'NEW_2') 
WHERE description like '%DESC_B%' 

НТН

+0

Да, он тоже должен работать. С тоже классно. –

1

Кстати, если вы действительно хотите использовать КТР для обновления (хотя я предпочитаю более простые обновления), вы можете. Но вам нужно включить обновленный столбец в CTE, а обновляемая таблица - это имя CTE, а не исходное имя табуляции. Например:

;WITH Pieces(id, description, newdesc) 
AS(
SELECT itemid, description, REPLACE(REPLACE(description, 'DESC_A', 'DESC_B'), 'NEW_1', 'NEW_2') 
FROM myTable WHERE description like '%DESC_A%DESC_B%' 
) 
UPDATE Pieces SET description = newdesc 
Смежные вопросы