sql >> Databáze >  >> RDS >> Sqlserver

proč nemohu získat přístup ke svému CTE poté, co jsem jej jednou použil?

Ve vašem vzorovém kódu přetrvává CTE pouze pro UPDATE. Pokud potřebujete, aby vydržel déle, zvažte naplnění #tempTable nebo @tableVariable a poté z nich UPDATE a DELETE.

Svou AKTUALIZACI můžete také rozšířit tak, aby používala OUTPUT klauzule, jako je následující, abyste mohli zachytit dotčené řádky. A použijte je v DELETE, jako zde:

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

VÝSTUP:

(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. Rails aktivní záznam dotaz získává většinu běžných objektů

  2. Vrátit seznam databázových poštovních profilů v SQL Server (T-SQL)

  3. Mapování pole pomocí režimu spánku

  4. MySQL:Direktiva, aby všechny sloupce procházely podřetězcem?