Dalam kode contoh Anda, CTE hanya bertahan untuk UPDATE. Jika Anda membutuhkannya untuk bertahan lebih lama, pertimbangkan untuk mengisi #tempTable atau @tableVariable dengannya, lalu UPDATE dan DELETE dari itu.
Anda juga dapat meningkatkan PEMBARUAN untuk menggunakan OUTPUT klausa, seperti berikut ini, sehingga Anda dapat menangkap baris yang terpengaruh. Dan gunakan di DELETE, seperti di sini:
set nocount on
DECLARE @Table table (PK int, col1 varchar(5))
DECLARE @SavedPks table (PK int)
INSERT INTO @Table VALUES (1,'g')
INSERT INTO @Table VALUES (2,'g')
INSERT INTO @Table VALUES (3,'g')
INSERT INTO @Table VALUES (4,'g')
INSERT INTO @Table VALUES (5,'x')
INSERT INTO @Table VALUES (6,'x')
set nocount off
;WITH MYCTE
AS
(
SELECT PK, col1 FROM @Table
)
UPDATE MYCTE
SET col1='xyz'
OUTPUT INSERTED.PK
INTO @SavedPks
WHERE col1='g'
SELECT 'A',* FROM @Table
DELETE @Table
WHERE PK IN (SELECT PK from @SavedPks)
SELECT 'B',* FROM @Table
KELUARAN:
(4 row(s) affected)
PK col1
---- ----------- -----
A 1 xyz
A 2 xyz
A 3 xyz
A 4 xyz
A 5 x
A 6 x
(6 row(s) affected)
(4 row(s) affected)
PK col1
---- ----------- -----
B 5 x
B 6 x
(2 row(s) affected)