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

Usare CTE come loop di blocco?

In generale non puoi.

È valido solo per l'istruzione successiva. Puoi definire una vista con la stessa definizione se desideri riutilizzare la definizione per più istruzioni o materializzalo tu stesso in una tabella/variabile di tabella temporanea per riutilizzare i risultati .

Per il caso specifico nella tua domanda potresti fare tutto in un'unica affermazione.

WITH cte
     AS (SELECT 1 AS n
         UNION ALL
         SELECT n + 1
         FROM   cte
         WHERE  n + 1 <= 10)
INSERT INTO tbl1
            (id)
OUTPUT      INSERTED.id
INTO tbl2(id)
SELECT n
FROM   cte