【问题标题】:SQL Server – inserting multiple rows with single (ANSI style) statementSQL Server – 使用单个(ANSI 样式)语句插入多行
【发布时间】:2012-04-23 06:52:53
【问题描述】:

我正在使用以下方法使用单个 INSERT 语句插入多行,即插入行的 ANSI 样式。它在 SQL Server 2008 和 2012 中可用。我不确定 SQL Server 2005/ 2000。

创建测试表:

create table TestInsert (ID INT, Name NVARCHAR(50))

单个INSERT 语句插入5行

INSERT INTO TestInsert 
VALUES (1,'a'),
       (2,'b'),
       (3,'c'),
       (4,'d'),
       (5,'e')

如果有其他最好的方法来实现这一点,请告诉我

【问题讨论】:

  • 此插入样式在 SQL Server 2000 和 2005 中可用。

标签: sql sql-server tsql sql-server-2008 sql-insert


【解决方案1】:

试试这个:

INSERT TestInsert
    SELECT  1, 'a'
    UNION ALL
    SELECT  2, 'b'
    UNION ALL
    SELECT  3, 'c'
    UNION ALL
    SELECT  4, 'd'
    UNION ALL
    SELECT 5, 'e' 

【讨论】:

    【解决方案2】:

    SQL Server - 使用单个(ANSI 样式)语句插入多行

    对于 SQL Server 2000+

    根据SQL The Complete Reference, Third Edition (August 12, 2009)

    1) 多行 INSERT 的语法是

    INSERT INTO table-name (columns not mandatory) 
    query
    

    (第 236 页,图 10-3)。

    2) SELECT 语句具有强制的 FROM 子句(第 87 页,图 6-1)。

    因此,在这种情况下,要仅使用一个 INSERT 语句插入多行,我们需要一个 auxiliary table with just one row

    CREATE TABLE dual(value INT PRIMARY KEY CHECK(value = 1))
    INSERT dual(value) VALUES(1)
    

    然后

    INSERT INTO table-name (columns) -- the columns are not mandatory
    SELECT values FROM dual
    UNION ALL
    SELECT another-values FROM dual
    UNION ALL
    SELECT another-values FROM dual
    

    编辑 2:对于 SQL Server 2008+

    从 SQL Server 2008 开始,我们可以使用行构造函数:(values for row 1), (values for row 2), (values for row 3), etc.(第 218 页)。

    所以,

    INSERT INTO TestInsert 
    VALUES (1,'a'), --The string delimiter is ' not ‘...’
           (2,'b'),
           (3,'c'),
           (4,'d'),
           (5,'e')
    

    适用于 SQL Server 2008+。

    【讨论】:

      猜你喜欢
      • 2018-05-08
      • 2018-03-20
      • 2010-10-01
      • 2023-03-08
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      相关资源
      最近更新 更多