Você precisa colocar o CTE primeiro e depois combinar o INSERT INTO com sua instrução select. Além disso, a palavra-chave "AS" após o nome do CTE não é opcional:
WITH tab AS (
bla bla
)
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (
BatchID,
AccountNo,
APartyNo,
SourceRowID
)
SELECT * FROM tab
Observe que o código pressupõe que o CTE retornará exatamente quatro campos e que esses campos estejam em ordem e digite com os especificados na instrução INSERT. Se não for esse o caso, substitua "SELECT *" por uma seleção específica dos campos necessários.
Quanto à sua pergunta sobre o uso de uma função, eu diria "depende". Se você estiver colocando os dados em uma tabela apenas por razões de desempenho e a velocidade for aceitável ao usá-los por meio de uma função, consideraria a função uma opção. Por outro lado, se você precisar usar o resultado do CTE em várias consultas diferentes e a velocidade já for um problema, eu usaria uma tabela (regular ou temporária).
COM expressão_tabela_ comum (Transact-SQL)
Sim:
Observe que isso é para o SQL Server, que suporta vários CTEs:
O Teradata permite apenas um CTE e a sintaxe é o seu exemplo.
fonte