Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

dlaczego nie mogę uzyskać dostępu do mojego CTE po użyciu go raz?

W przykładowym kodzie CTE utrzymuje się tylko dla UPDATE. Jeśli potrzebujesz, aby trwał dłużej, rozważ wypełnienie nim #tempTable lub @tableVariable, a następnie AKTUALIZUJ i USUŃ z nich.

Możesz również rozszerzyć swoją UPDATE, aby użyć WYJŚCIA klauzula, jak poniżej, aby można było przechwycić wiersze, których to dotyczy. I użyj ich w DELETE, jak tutaj:

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

WYJŚCIE:

(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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy zadanie SQL Server pominie zaplanowane uruchomienie, jeśli jest już uruchomione?

  2. DATEDIFF_BIG() Przykłady w SQL Server

  3. sql:USUŃ + WSTAW vs AKTUALIZUJ + WSTAW

  4. Suma częściowa między różnymi rekordami przy użyciu SQL 2008

  5. Sql binary to c# - Jak uzyskać binarny odpowiednik kodu binarnego SQL w c#