Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

защо не мога да получа достъп до моя CTE, след като съм го използвал веднъж?

Във вашия примерен код CTE се запазва само за АКТУАЛИЗАЦИЯТА. Ако имате нужда да продължи по-дълго, помислете за попълване на #tempTable или @tableVariable с него и след това АКТУАЛИЗИРАНЕ и ИЗТРИВАНЕ от тях.

Можете също така да увеличите своята АКТУАЛИЗАЦИЯ, за да използвате ИЗХОД клауза, като следната, за да можете да заснемете засегнатите редове. И ги използвайте в DELETE, като тук:

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

ИЗХОД:

(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. Архитектура на SQL Server AlwaysOn (група за наличност) и инсталация стъпка по стъпка -3 Ръководство за отказ от стъпки

  2. Задължителен първичен ключ за Sql сървър

  3. Методът SqlDataAdapter.Fill бавен

  4. SQL Server PDF Full-Text Search не работи на FileStream PDF файл

  5. Инструкцията ALTER TABLE е в конфликт с ограничението FOREIGN KEY