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

hvorfor kan jeg ikke få adgang til min CTE, efter jeg har brugt den én gang?

I din eksempelkode fortsætter CTE kun for OPDATERING. Hvis du har brug for, at den holder længere, kan du overveje at udfylde en #tempTable eller @tableVariable med den og derefter OPDATERE og SLETTE fra dem.

Du kan også udvide din OPDATERING for at bruge en OUTPUT klausul, som følgende, så du kan fange de berørte rækker. Og brug dem i DELETE, som her:

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
 

OUTPUT:

(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. UPDATE-sætning med flere joinforbindelser i PostgreSQL

  2. Eksporter tabel fra Postgres database (på server) til csv-fil (på lokal) i java

  3. Hvordan opdeles intervallet mellem to datoer i detaljer efter måned?

  4. Henter data fra MySQL-database ved hjælp af PHP, Viser dem i en formular til redigering