INSERT INTO ve WITH / CTE'yi birleştirme


157

Çok karmaşık bir CTE'm var ve sonucu fiziksel bir tabloya eklemek istiyorum.

Aşağıdakiler geçerli mi?

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

Bu CTE'yi oluşturmak için yeniden kullanmama izin verecek bir işlev kullanmayı düşünüyorum. Düşüncesi olan var mı?

Yanıtlar:


271

Önce CTE'yi koymanız ve ardından INSERT INTO'yu select deyiminizle birleştirmeniz gerekir. Ayrıca, CTE'nin adını izleyen "AS" anahtar kelimesi isteğe bağlı değildir:

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

Kodun CTE'nin tam olarak dört alan döndüreceğini ve bu alanların INSERT deyiminde belirtilenlerle sırayla ve türle eşleştiğini varsaydığını lütfen unutmayın. Eğer durum böyle değilse, "SELECT *" ifadesini istediğiniz alanları seçmeniz yeterlidir.

Bir işlevi kullanma hakkındaki sorunuza gelince, "buna bağlıdır" derim. Verileri yalnızca performans nedenlerinden dolayı bir tabloya koyuyorsanız ve bir işlev aracılığıyla kullanırken hız kabul edilebilirse, işlevin bir seçenek olduğunu düşünürüm. Öte yandan, CTE'nin sonucunu birkaç farklı sorguda kullanmanız gerekiyorsa ve hız zaten bir sorunsa, bir tabloya (normal veya geçici) giderim.

Common_table_expression İLE (Transact-SQL)


19

WITHOrtak Masa İfadeler için hükmü üstünde gidin.

Bir CTE'deki her ekin sarılması, sorgu mantığını sütun eşlemesinden görsel olarak ayırmanın yararına sahiptir.

Hatayı bulun:

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:

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

Birkaç kazan plakası, kodun çok sayıda sütunla bile doğru sırada doğru sayıda sütun eklediğini doğrulamayı son derece kolaylaştırır. Gelecekteki benliğiniz daha sonra size teşekkür edecektir.


3
Bu harika! Birdenbire, INSERT ifadelerinden o kadar nefret etmiyorum ...
NReilingh

1
Bu son derece kullanışlıdır. İlk okumada onu özleyen herkes için, bunun çözdüğü sorun, bir ekleme ifadesinde, eşlemenin, eklenecek alanların göreli sıralaması ve bunlara eklenecek değerlerin ayrı olarak listelenmesiyle tanımlanmasıdır. Bunları normal olarak yazarsanız, iki siparişin aynı olup olmadığını görsel olarak kontrol etmek inanılmaz derecede zordur. CTE, değerleri, eklenecekleri sütun adlarıyla adlandırmanıza olanak tanır; bu, bunları gerçekten iki satıra hizalayabileceğiniz anlamına gelir.
Tidorith

16

Evet:

WITH tab (
  bla bla
)

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

SELECT * FROM tab

Bunun birden çok CTE'yi destekleyen SQL Server için olduğunu unutmayın:

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

Teradata sadece bir CTE'ye izin verir ve sözdizimi örnek olarak verilmiştir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.