0

爲了說明這一點:我正在運行SQL Server 2005.質量插入與CTE插入

我很難決定使用哪種方法來插入我正在執行的操作。

它開始作爲一個非常簡單的100行插入使用,例如:

BEGIN TRAN 
INSERT INTO TABLE1 (COL1, COL2, COL3, COL4) VALUES (1,'2',3,'4') 
INSERT INTO TABLE1 (COL1, COL2, COL3, COL4) VALUES (5,'6',7,'8') 
INSERT INTO TABLE1 (COL1, COL2, COL3, COL4) VALUES (9,'10',11,'12') 
INSERT INTO TABLE1 (COL1, COL2, COL3, COL4) VALUES (13,'14',15,'16') 

現在,我可讀和直接的SQL的粉絲,但它開始烏爾克我,當重複相同的代碼一遍又一遍,我想知道是否有更好的方式去重複插入如此。

我發現了CTE,並開始尋找我需要做的工作,以便將其插入到我的插件中,以便稍微清理代碼。這改變了我的查詢到以下幾點:

BEGIN TRAN 
;WITH CTEINSERT (COL1, COL2, COL3, COL4) 
AS 
    (
     SELECT 1,'2',3,'4' UNION ALL 
     SELECT 5,'6',7,'8' UNION ALL 
     SELECT 9,'10',11,'12' UNION ALL 
     SELECT 13,'14',15,'16' 
    ) 
INSERT INTO TABLE1 (COL1, COL2, COL3, COL4) 
    (SELECT COL1, COL2, COL3, COL4 
    FROM CTEINSERT) 

所以,這使我的查詢一點點動態(可能的話一個不錯的選擇),並刪除了之前曾是討厭我重複,但它有一些重複,至少現在'INSERT INTO'的重複已經消失。

如果我正在運行SQL Server 2008,我顯然可以刪除每行前面的重複INSERT INTO,只需指定我需要在1 INSERT INTO傘下插入的值,但這不是一個選項。

我的問題是,這是否使查詢「更好」,除了在眼睛上稍微容易一點(這可能主觀無論如何)?這是否更有效率或更好/更容易在系統上,然後原始重複INSERT INTO查詢?我只是在想這個,應該回到我之前做的事情上?

感謝

回答

2

就可以避免第一個例子中的重複性,並避免使用CTE使用Table Valued Constructor,我認爲這是更容易閱讀和維護比您的兩個例子:

Demo SQL Fiddle

MS SQL Server模式設置

CREATE TABLE Table1 
    ([COL1] int, [COL2] varchar(2), [COL3] int, [COL4] varchar(2)) 
; 

INSERT INTO Table1 
    ([COL1], [COL2], [COL3], [COL4]) 
VALUES 
    (1, '2' , 3 , '4'), 
    (5, '6' , 7 , '8'), 
    (9, '10', 11, '12'), 
    (13,'14', 15, '16') 
; 

查詢1

SELECT * FROM Table1 

Results

| COL1 | COL2 | COL3 | COL4 | 
|------|------|------|------| 
| 1 | 2 | 3 | 4 | 
| 5 | 6 | 7 | 8 | 
| 9 | 10 | 11 | 12 | 
| 13 | 14 | 15 | 16 | 
+0

謝謝你交朋友。這是我的可用選項列表,但希望避免創建一個表來保存我的信息。我開始覺得這種方法至少是最少的徵稅,儘管你仍然需要創建一個表格,當我們談論100-200個首先需要應用表格的插入時,這個表格看起來很亂。我可能會使用此方法並在將代碼發送給實施之前創建表以最小化SQL。 – 2014-12-03 11:17:36

+0

您不必創建該表,只是爲了說明如何做到這一點。您只需用實際的表名替換「Table1」即可。或者,如果您想要將數據放在表格中,請使用#temp表格。 – Tanner 2014-12-03 11:19:19