Вам нужно сначала поставить CTE, а затем объединить INSERT INTO с вашим оператором select. Кроме того, «AS» ключевое слово следующим именем КТР не является необязательным:
WITH tab AS (
bla bla
)
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (
BatchID,
AccountNo,
APartyNo,
SourceRowID
)
SELECT * FROM tab
Пожалуйста, обратите внимание, что код предполагает, что ОТВ будет возвращать ровно четыре поля, и эти поля соответствия в порядке и типа с указанными в заявление INSERT. Если это не так, просто замените «SELECT *» на определенный выбор полей, которые вам нужны.
Что касается вашего вопроса об использовании функции, я бы сказал «это зависит». Если вы помещаете данные в таблицу только по соображениям производительности, и скорость приемлема при использовании ее через функцию, я бы рассматривал функцию как опцию. С другой стороны, если вам нужно использовать результат CTE в нескольких разных запросах, а скорость уже проблема, я бы пошел за таблицей (регулярной или временной).
WITH common_table_expression (Transact-SQL)
Это замечательно! Внезапно я не ненавижу заявления INSERT так сильно ... – NReilingh