Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum kann ich nicht auf mein CTE zugreifen, nachdem ich es einmal verwendet habe?

In Ihrem Beispielcode bleibt der CTE nur für das UPDATE bestehen. Wenn es länger dauern soll, erwägen Sie, eine #tempTable oder @tableVariable damit zu füllen und diese dann zu aktualisieren und zu löschen.

Sie können Ihr UPDATE auch erweitern, um eine AUSGABE zu verwenden -Klausel wie die folgende, damit Sie die betroffenen Zeilen erfassen können. Und verwenden Sie sie im LÖSCHEN, wie hier:

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

AUSGABE:

(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)