TSQL:使用With语句更新值?

时间:2009-04-03 21:34:33

标签: sql sql-server-2005 tsql

我有一个包含列的表我想更新其值。以下是TSQL代码的示例:

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
....

3 个答案:

答案 0 :(得分:4)

也许

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

答案 1 :(得分: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%'

如果这两个字段永远不在同一个字段中,那么在大表的情况下,您可以使用两个单独的语句来更好地管理资源。

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%'

HTH

答案 2 :(得分:1)

顺便说一句,如果您真的想要使用CTE进行更新(尽管我更喜欢更直接的更新),您可以。但是,您必须在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