Във вашия примерен код CTE се запазва само за АКТУАЛИЗАЦИЯТА. Ако имате нужда да продължи по-дълго, помислете за попълване на #tempTable или @tableVariable с него и след това АКТУАЛИЗИРАНЕ и ИЗТРИВАНЕ от тях.
Можете също така да увеличите своята АКТУАЛИЗАЦИЯ, за да използвате ИЗХОД клауза, като следната, за да можете да заснемете засегнатите редове. И ги използвайте в DELETE, като тук:
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
ИЗХОД:
(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)