我有一个包含列的表我想更新其值。以下是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
....
答案 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