【问题标题】:TSQL: Update values by using With statement?TSQL:使用With语句更新值?
【发布时间】:2009-04-03 21:34:32
【问题描述】:

我有一个表,其中有一列我想更新它的值。以下是 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
....

更新的将是:

....
xxxNEW_1yyyNEW_2wwww
aaaNEW_1xxNEW_2eee
....

【问题讨论】:

  • 我可以定义一个 Table 变量并将值插入 WITH 语句,然后循环通过 myTable 进行更新。是否可以仅使用 WITH 语句?
  • 列名“newdesc”无效。
  • 如果你做一个 SELECT id,newdesc(而不是更新)它工作正常吗?
  • 大卫,你检查我的答案了吗?

标签: sql sql-server-2005 tsql


【解决方案1】:

也许

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

【讨论】:

  • 谢谢乔尼,周末愉快!
  • 很高兴它成功了。您的回答只是部分解决了他的问题 - 更新语法,而不是值的实际更改。
  • 您也可以为更新的表使用别名并进行正常连接(即 UPDATE m SET ... FROM myTable m INNER JOIN Pieces p ON ...
【解决方案2】:

顺便说一句,如果您真的想使用 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 

【讨论】:

    【解决方案3】:

    这应该做你想做的事。你不需要在这里。

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2013-06-07
      • 2016-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多