Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

perché non posso accedere al mio CTE dopo averlo usato una volta?

Nel codice di esempio, il CTE persiste solo per l'AGGIORNAMENTO. Se hai bisogno che duri più a lungo, considera la possibilità di popolare una #tempTable o @tableVariable con essa, quindi AGGIORNA ed ELIMINA da quelli.

Puoi anche aumentare il tuo AGGIORNAMENTO per utilizzare un OUTPUT clausola, come la seguente, in modo da poter acquisire le righe interessate. E usali nel DELETE, come qui:

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

USCITA:

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