质量插入与CTE插入

时间:2014-12-03 10:26:47

标签: sql sql-server sql-server-2005 insert common-table-expression

前言:我正在运行SQL Server 2005。

我很难决定采用哪种方法进行插入操作。

它起初是一个非常简单的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)

所以,这使得我的查询更加动态(可能是一个糟糕的词语选择),并且已经删除了之前让我烦恼的重复,虽然它有一些重复,至少现在是'插入'重复已经消失。

如果我在运行SQL Server 2008,我显然可以删除每行前面的重复INSERT INTO,只需指定我需要在1 INSERT INTO伞下插入的值,但这不是一个选项。

我的问题是,这是否会使查询更好?'除了在眼睛上稍微容易一点之外(这可能是主观的)?这是原始的重复INSERT INTO查询在系统上更高效,更好/更容易吗?我只是在想这个,应该回到我以前做过的事情?

由于

1 个答案:

答案 0 :(得分:2)

您可以避免第一个示例的重复性,并避免使用 Table Valued Constructor 来使用cte,我认为这比您的两个示例更易读,更易于维护:

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 |