2010-07-22 2 views
119

У меня очень сложный CTE, и я хотел бы вставить результат в физическую таблицу.Сочетание INSERT INTO и WITH/CTE

Возможно ли следующее:

INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos 
(
    BatchID, 
    AccountNo, 
    APartyNo, 
    SourceRowID 
)  
WITH tab (
    -- some query 
)  
SELECT * FROM tab 

Я думаю об использовании функции для создания этого CTE, которая позволит мне повторно использовать. Есть предположения?

ответ

203

Вам нужно сначала поставить 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)

14

Yep:

WITH tab (
    bla bla 
) 

INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos ( BatchID,              AccountNo, 
APartyNo, 
SourceRowID)  

SELECT * FROM tab 

Обратите внимание, что это для SQL Server, который поддерживает несколько КТР:

WITH x AS(), y AS() INSERT INTO z (a, b, c) SELECT a, b, c FROM y 

Teradata позволяет только один КТР и синтаксис в качестве примера.

12

Предложение WITH для общей таблицы выражений идут сверху.

Обертка каждой вставки в CTE позволяет визуально изолировать логику запроса от сопоставления столбцов.

Пятно ошибка:

WITH _INSERT_ AS (
    SELECT 
    [BatchID]  = blah 
    ,[APartyNo]  = blahblah 
    ,[SourceRowID] = blahblahblah 
    FROM Table1 AS t1 
) 
INSERT Table2 
     ([BatchID], [SourceRowID], [APartyNo]) 
SELECT [BatchID], [APartyNo], [SourceRowID] 
FROM _INSERT_ 

же ошибка:

INSERT Table2 (
    [BatchID] 
,[SourceRowID] 
,[APartyNo] 
) 
SELECT 
    [BatchID]  = blah 
,[APartyNo]  = blahblah 
,[SourceRowID] = blahblahblah 
FROM Table1 AS t1 

Несколько строк шаблонного делают его чрезвычайно легко проверить код вставляет нужное количество столбцов в в правильном порядке, даже с очень большим количеством столбцов. Ваше будущее будет благодарно вам.

+2

Это замечательно! Внезапно я не ненавижу заявления INSERT так сильно ... – NReilingh