Musisz najpierw umieścić CTE, a następnie połączyć INSERT INTO z instrukcją select. Ponadto słowo kluczowe „AS” po nazwie CTE nie jest opcjonalne:
WITH tab AS (
bla bla
)
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (
BatchID,
AccountNo,
APartyNo,
SourceRowID
)
SELECT * FROM tab
Należy pamiętać, że kod zakłada, że CTE zwróci dokładnie cztery pola i że te pola są zgodne w kolejności i typu z polami określonymi w instrukcji INSERT. Jeśli tak nie jest, po prostu zastąp „SELECT *” konkretnym wyborem wymaganych pól.
Jeśli chodzi o twoje pytanie dotyczące korzystania z funkcji, powiedziałbym, że „to zależy”. Jeśli umieszczasz dane w tabeli tylko ze względu na wydajność, a prędkość jest akceptowalna, gdy używasz jej przez funkcję, rozważę funkcję jako opcję. Z drugiej strony, jeśli chcesz użyć wyniku CTE w kilku różnych zapytaniach, a szybkość jest już problemem, wybrałbym tabelę (zwykłą lub tymczasową).
Z common_table_expression (Transact-SQL)
Tak:
Zwróć uwagę, że dotyczy to SQL Server, który obsługuje wiele CTE:
Teradata dopuszcza tylko jedno CTE, a składnia jest przykładowa.
źródło