Primero debe poner el CTE y luego combinar INSERT INTO con su instrucción select. Además, la palabra clave "AS" que sigue al nombre del CTE no es opcional:
WITH tab AS (
bla bla
)
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (
BatchID,
AccountNo,
APartyNo,
SourceRowID
)
SELECT * FROM tab
Tenga en cuenta que el código supone que el CTE devolverá exactamente cuatro campos y que esos campos coinciden en orden y tipo con los especificados en la instrucción INSERT. Si ese no es el caso, simplemente reemplace el "SELECCIONAR *" con una selección específica de los campos que necesita.
En cuanto a su pregunta sobre el uso de una función, diría "depende". Si coloca los datos en una tabla solo por razones de rendimiento, y la velocidad es aceptable cuando se usa a través de una función, entonces consideraría que la función es una opción. Por otro lado, si necesita usar el resultado del CTE en varias consultas diferentes, y la velocidad ya es un problema, elegiría una tabla (ya sea regular o temporal).
WITH common_table_expression (Transact-SQL)
Sí:
Tenga en cuenta que esto es para SQL Server, que admite varios CTE:
Teradata solo permite un CTE y la sintaxis es su ejemplo.
fuente