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