Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

mengapa saya tidak dapat mengakses CTE saya setelah saya menggunakannya sekali?

Dalam kode contoh Anda, CTE hanya bertahan untuk UPDATE. Jika Anda membutuhkannya untuk bertahan lebih lama, pertimbangkan untuk mengisi #tempTable atau @tableVariable dengannya, lalu UPDATE dan DELETE dari itu.

Anda juga dapat meningkatkan PEMBARUAN untuk menggunakan OUTPUT klausa, seperti berikut ini, sehingga Anda dapat menangkap baris yang terpengaruh. Dan gunakan di DELETE, seperti di sini:

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

KELUARAN:

(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. Prosedur tersimpan sepertinya hang tanpa penjelasan

  2. Sisipkan Massal File CSV yang Dikutip Sebagian di SQL Server

  3. SQL Server JOIN tidak memiliki nilai NULL

  4. Menggunakan LIKE di sp_executesql

  5. 5 Fakta Teratas untuk Menemukan dan Mengganti Teks SQL di SQL Server dengan Fungsi REPLACE