Спершу потрібно поставити CTE, а потім поєднати INSERT INTO із вашим оператором select. Крім того, ключове слово "AS" після імені CTE не є обов'язковим:
WITH tab AS (
bla bla
)
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (
BatchID,
AccountNo,
APartyNo,
SourceRowID
)
SELECT * FROM tab
Зверніть увагу, що код передбачає, що CTE поверне рівно чотири поля і що ці поля відповідають за порядком і типом з тими, які вказані в операторі INSERT. Якщо це не так, просто замініть "ВИБІР *" конкретним вибором потрібних полів.
Щодо вашого питання щодо використання функції, я б сказав "це залежить". Якщо ви заносите дані в таблицю тільки з причин продуктивності, а швидкість прийнятна при використанні їх через функцію, то я вважаю функцію опцією. З іншого боку, якщо вам потрібно використовувати результат CTE в декількох різних запитах, а швидкість - це вже проблема, я б пішов за таблицю (або звичайну, або тимчасову).
З common_table_expression (Transact-SQL)