2009-04-03 13 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

それを受け入れる方法は?私はそれを理解することはできません(受け入れない)。 –

+0

下のチェックをクリックしてくださいupvote downvote arrow –

+0

ありがとう、ジョニー、いい週末を! –

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

あなたは大きなテーブルの場合には、より良いリソースマングメントのための2つの別々のステートメントを使用することができます。ところで

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

+0

はい。 –

1

、あなたは本当にあなたができる、(私はもっと簡単な更新を好むが)更新のためのCTEを使用する場合。ただし、更新された列をCTEに含める必要があります。更新する表は、元のtablenameではなく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 
関連する問題