Сначала нужно поставить 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. Если это не так, просто замените «SELECT *» определенным выбором полей, которые вам нужны.
Что касается вашего вопроса об использовании функции, я бы сказал «это зависит». Если вы помещаете данные в таблицу только из-за соображений производительности, и скорость является приемлемой при использовании их через функцию, тогда я считаю, что функция является опцией. С другой стороны, если вам нужно использовать результат CTE в нескольких разных запросах, а скорость уже является проблемой, я бы выбрал таблицу (обычную или временную).
WITH common_table_expression (Transact-SQL)