sql >> Databasteknik >  >> RDS >> Sqlserver

varför kan jag inte komma åt min CTE efter att jag använt den en gång?

I din exempelkod kvarstår CTE endast för UPPDATERING. Om du vill att den ska hålla längre, överväg att fylla i en #tempTable eller @tableVariable med den, och sedan UPPDATERA och DELETE från dessa.

Du kan också utöka din UPPDATERING för att använda en OUTPUT klausul, som följande, så att du kan fånga de berörda raderna. Och använd dem i DELETE, som här:

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

UTGÅNG:

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


  1. SQLSTATE[23000]:Felhantering för överträdelse av integritetsbegränsning

  2. Anrop till en medlemsfunktion på ett icke-objekt - PHP

  3. INSERT IGNORE ökar den automatiska inkrementräknaren även om ingen post har lagts till?

  4. Förhindra härkomst av egennamn i PostgreSQL?