2010-07-22 16 views
119

Çok karmaşık bir CTE'ye sahibim ve sonucu fiziksel bir tabloya eklemek istiyorum.INSERT INTO ve WITH/CTE'yi birleştirme

Aşağıdaki geçerli mi?

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

bana yeniden sağlayacak bu CTE oluşturmak için bir işlev kullanarak düşünüyorum. Düşüncesi olan var mı?

cevap

203

Önce CTE'yi koyup INSERT INTO'yu select ifadenizle birleştirmeniz gerekir. Ayrıca, CTE adının aşağıdaki anahtar sözcüğü "GİBİ" isteğe bağlı değildir:

WITH tab AS (
    bla bla 
) 
INSERT INTO dbo.prf_BatchItemAdditionalAPartyNos (
BatchID, 
AccountNo, 
APartyNo, 
SourceRowID 
) 
SELECT * FROM tab 

kod bu alanları ile tanımlanan yapılarla düzen ve tip eşleştirme olduğunu CTE tam dört alanları dönecektir varsayar ve lütfen unutmayın INSERT ifadesi. Bu durumda, "SELECT *" yerine, istediğiniz alanların belirli bir seçimini yapın.

Bir işlev kullanma konusundaki sorunuza gelince, "buna bağlı" diyorum. Verileri performans nedenlerinden dolayı bir tabloya koyuyorsanız ve bir işlev aracılığıyla kullanıldığında hız kabul edilebilirse, bir seçenek olarak işlevini düşünürdüm. Öte yandan, CTE sonucunu birkaç farklı sorguda kullanmanız gerekiyorsa ve hız zaten bir sorunsa, bir tabloya (düzenli veya geçici) giderdim.

WITH common_table_expression (Transact-SQL)

14

Yep: Bu çoklu CTEs destekler SQL Server, için olduğunu

WITH tab (
    bla bla 
) 

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

SELECT * FROM tab 

Not:

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

Teradata tek CTE izin verir ve sözdizimi sizin örnek olduğu gibi.

12

Ortak Masa İfadeler için WITH fıkra üstündeki gidin.

CTE'deki her eki sarmak, sütun mantığından sorgu mantığını görsel olarak ayırma yararına sahiptir.

Nokta hata:

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_ 

aynı hata: Demirbaş ait

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

birkaç satır kodu doğrulamak için son derece kolay hale sütunların sağ numarası ekleyen Çok fazla sayıda sütunda bile doğru sipariş. Gelecekteki kendiniz daha sonra size teşekkür edecek.

+2

Bu harika! Birdenbire, INSERT ifadelerinden çok da nefret etmiyorum. – NReilingh

İlgili konular