首页 文章

如何在不重复声明的“INSERT INTO dbo.Blah”部分的情况下插入多行?

提问于
浏览
469

我知道我已经在几年前做过这个了,但是我记不起语法了,由于提取了大量关于“批量导入”的帮助文档和文章,我无法在任何地方找到它 .

这是我想要做的,但语法不完全正确...请,之前做过这个的人,帮帮我:)

INSERT INTO dbo.MyTable (ID, Name)
VALUES (123, 'Timmy'),
    (124, 'Jonny'),
    (125, 'Sally')

我知道这接近正确的语法 . 我可能在那里需要"BULK"这个词,或者其他什么,我不记得了 . 任何的想法?

我需要这个SQL Server 2005数据库 . 我试过这段代码,但无济于事:

DECLARE @blah TABLE
(
    ID INT NOT NULL PRIMARY KEY,
    Name VARCHAR(100) NOT NULL
)

INSERT INTO @blah (ID, Name)
    VALUES (123, 'Timmy')
    VALUES (124, 'Jonny')
    VALUES (125, 'Sally')

SELECT * FROM @blah

我正在 Incorrect syntax near the keyword 'VALUES'.

13 回答

  • 6

    我一直在使用以下内容:

    INSERT INTO [TableName] (ID, Name)
    values (NEWID(), NEWID())
    GO 10
    

    它将为ID和Name添加十行,具有唯一的GUID .

    注意:不要用';'结束最后一行(GO 10)因为它会抛出错误:发生了致命的脚本错误 . 解析GO时遇到错误的语法 .

  • 13

    如果您的数据已经在数据库中,您可以:

    INSERT INTO MyTable(ID, Name)
    SELECT ID, NAME FROM OtherTable
    

    如果您需要对数据进行硬编码,那么SQL 2008及更高版本允许您执行以下操作...

    INSERT INTO MyTable (Name, ID)
    VALUES ('First',1),
    ('Second',2),
    ('Third',3),
    ('Fourth',4),
    ('Fifth',5)
    
  • 2

    你可以使用一个联盟:

    INSERT INTO dbo.MyTable (ID, Name) 
    SELECT ID, Name FROM (
        SELECT 123, 'Timmy'
        UNION ALL
        SELECT 124, 'Jonny'
        UNION ALL
        SELECT 125, 'Sally'
    ) AS X (ID, Name)
    
  • 1

    对于SQL Server 2008,这看起来没问题 . 对于SS2005及更早版本,您需要重复VALUES语句 .

    INSERT INTO dbo.MyTable (ID, Name)  
    VALUES (123, 'Timmy')  
    VALUES (124, 'Jonny')   
    VALUES (125, 'Sally')
    

    EDIT:: 我的不好 . 你必须为SS2005中的每一行重复'INSERT INTO' .

    INSERT INTO dbo.MyTable (ID, Name)  
    VALUES (123, 'Timmy')  
    INSERT INTO dbo.MyTable (ID, Name)  
    VALUES (124, 'Jonny')   
    INSERT INTO dbo.MyTable (ID, Name)  
    VALUES (125, 'Sally')
    
  • 8

    你可以这样做(丑陋但它有效):

    INSERT INTO dbo.MyTable (ID, Name) 
    select * from
    (
     select 123, 'Timmy'
      union all
     select 124, 'Jonny' 
      union all
     select 125, 'Sally'
     ...
    ) x
    
  • 6
    USE YourDB
    GO
    INSERT INTO MyTable (FirstCol, SecondCol)
    SELECT 'First' ,1
    UNION ALL
    SELECT 'Second' ,2
    UNION ALL
    SELECT 'Third' ,3
    UNION ALL
    SELECT 'Fourth' ,4
    UNION ALL
    SELECT 'Fifth' ,5
    GO
    

    或者您可以使用另一种方式

    INSERT INTO MyTable (FirstCol, SecondCol)
    VALUES 
    ('First',1),
    ('Second',2),
    ('Third',3),
    ('Fourth',4),
    ('Fifth',5)
    
  • 455

    在SQL Server中使用XML来插入多行会更容易,否则会变得非常繁琐 .

    查看完整文章,其中包含代码说明http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx

    将以下代码复制到sql server中以查看示例 .

    declare @test nvarchar(max)
    
    set @test = '<topic><dialog id="1" answerId="41">
            <comment>comment 1</comment>
            </dialog>
        <dialog id="2" answerId="42" >
        <comment>comment 2</comment>
            </dialog>
        <dialog id="3" answerId="43" >
        <comment>comment 3</comment>
            </dialog>
        </topic>'
    
    declare @testxml xml
    set @testxml = cast(@test as xml)
    declare @answerTemp Table(dialogid int, answerid int, comment varchar(1000))
    
    insert @answerTemp
    SELECT  ParamValues.ID.value('@id','int') ,
    ParamValues.ID.value('@answerId','int') ,
    ParamValues.ID.value('(comment)[1]','VARCHAR(1000)')
    FROM @testxml.nodes('topic/dialog') as ParamValues(ID)
    
  • 297

    对应于INSERT (Transact-SQL)(SQL Server 2005),您不能省略 INSERT INTO dbo.Blah 并且必须每次都指定它或使用其他语法/方法,

  • 6

    使用 INSERT INTO ... VALUES 语法中的 INSERT INTO ... VALUES 语法有一个恼人的限制:

    来自MSDN通过直接在VALUES列表中插入行可以构造的最大行数为1000

    省略此限制的最简单方法是使用派生表,如:

    INSERT INTO dbo.Mytable(ID, Name)
    SELECT ID, Name 
    FROM (
       VALUES (1, 'a'),
              (2, 'b'),
              --...
              -- more than 1000 rows
    )sub (ID, Name);
    

    LiveDemo


    这将从SQL Server 2008开始

  • 5
    INSERT INTO dbo.MyTable (ID, Name)
    SELECT 123, 'Timmy'
    UNION ALL
    SELECT 124, 'Jonny'
    UNION ALL
    SELECT 125, 'Sally'
    

    对于SQL Server 2008,可以在一个VALUES子句中完全根据您的问题中的语句执行它(您只需要添加一个逗号来分隔每个值语句)...

  • 6

    您的语法几乎适用于SQL Server 2008(但不适用于SQL Server 20051):

    CREATE TABLE MyTable (id int, name char(10));
    
    INSERT INTO MyTable (id, name) VALUES (1, 'Bob'), (2, 'Peter'), (3, 'Joe');
    
    SELECT * FROM MyTable;
    
    id |  name
    ---+---------
    1  |  Bob       
    2  |  Peter     
    3  |  Joe
    

    1当问题得到解答时,问题不明确是指SQL Server 2005.我在这里留下这个答案,因为我认为它仍然是相关的 .

  • 16

    这在SQL中非常快速且高效 . 假设你有表 Sample with 4 column a,b,c,d where a,b,d are int and c column is Varchar(50) .

    CREATE TABLE [dbo].[Sample](
    [a] [int] NULL,
    [b] [int] NULL,
    [c] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [D] [int] NULL
    )
    

    因此,您无法使用以下查询插入此表中的多个记录,而无需重复插入语句,

    DECLARE @LIST VARCHAR(MAX)
    SET @LIST='SELECT 1, 1, ''Charan Ghate'',11
         SELECT 2,2, ''Mahesh More'',12
         SELECT 3,3,''Mahesh Nikam'',13
         SELECT 4,4, ''Jay Kadam'',14'
    INSERT SAMPLE (a, b, c,d) EXEC(@LIST)
    

    也用C#使用 SqlBulkCopy bulkcopy = new SqlBulkCopy(con)

    您可以一次插入10行

    DataTable dt = new DataTable();
            dt.Columns.Add("a");
            dt.Columns.Add("b");
            dt.Columns.Add("c");
            dt.Columns.Add("d");
            for (int i = 0; i < 10; i++)
            {
                DataRow dr = dt.NewRow();
                dr["a"] = 1;
                dr["b"] = 2;
                dr["c"] = "Charan";
                dr["d"] = 4;
                dt.Rows.Add(dr);
            }
            SqlConnection con = new SqlConnection("Connection String");
            using (SqlBulkCopy bulkcopy = new SqlBulkCopy(con))
            {
                con.Open();
                bulkcopy.DestinationTableName = "Sample";
                bulkcopy.WriteToServer(dt);
                con.Close();
            }
    
  • 216

    这将实现您的要求:

    INSERT INTO table1 (ID, Name)
        VALUES (123, 'Timmy'), 
               (124, 'Jonny'), 
               (125, 'Sally');
    

    对于未来的开发人员,您还可以 insert from another table

    INSERT INTO table1 (ID, Name)
        SELECT 
             ID, 
             Name 
        FROM table2
    

    甚至 from multiple tables

    INSERT INTO table1 (column2, column3)
        SELECT 
             t2.column, 
             t3.column
        FROM table2 t2
             INNER JOIN table3 t3
             ON t2.ID = t3.ID
    

相关问题