Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 质量插入与CTE插入_Sql_Sql Server_Sql Server 2005_Insert_Common Table Expression - Fatal编程技术网

Sql 质量插入与CTE插入

Sql 质量插入与CTE插入,sql,sql-server,sql-server-2005,insert,common-table-expression,Sql,Sql Server,Sql Server 2005,Insert,Common Table Expression,前言:我正在运行SQLServer2005 我很难决定使用哪种方法进行插入 它从一个非常简单的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) VALUE

前言:我正在运行SQLServer2005

我很难决定使用哪种方法进行插入

它从一个非常简单的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,并开始查找我需要做些什么,以便在我的insert中使用它,稍微清理一下代码。这将我的查询转换为以下内容:

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,很明显,我可以删除每行前面的重复插入,只需指定我需要在1 INSERT-INTO伞下插入的值,但这不是一个选项

我的问题是,这是否会使查询在某种程度上“更好”,除了在视觉上更容易(这可能是主观的)?这在系统上是否比原始的重复插入查询更有效率或更好/更容易?我只是想得太多了,应该回到我以前做的事情吗


谢谢

您可以通过使用避免第一个示例的重复性,并避免使用cte,我认为它比您的两个示例更可读,更易于维护:

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')
;
SELECT * FROM Table1
查询1

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')
;
SELECT * FROM Table1


谢谢你,朋友。这是我的可用选项列表,但我想避免创建一个表来保存我的信息。我开始觉得,这种方法至少是最省力的,尽管您仍然需要创建一个表,当我们讨论100-200个首先需要应用于表的插入时,这个表可能看起来很混乱。我可能会使用这个方法,在发送代码进行实现之前创建表,以保持SQL最小。您不必创建表,这样做只是为了说明如何做到这一点。您只需用实际的表名替换
Table1
。或者,如果您想将数据放在表中,请使用#temp表。