插入多行,而不必重复语句的“ INSERT INTO…”部分?

问题描述 投票:523回答:15

[我知道我早在几年前就完成了此操作,但是我不记得该语法,而且由于收集了大量有关“批量导入”的帮助文档和文章,所以在任何地方都找不到它。

这是我想做的,但是语法不完全正确……请曾经做过此事的人帮帮我:)

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

我知道这是正确语法的close。我可能在其中需要“散装”一词,或者什么,我不记得了。有什么主意吗?

我需要此用于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'.

sql-server tsql sql-server-2005 insert
15个回答
324
投票
INSERT INTO dbo.MyTable (ID, Name)
SELECT 123, 'Timmy'
UNION ALL
SELECT 124, 'Jonny'
UNION ALL
SELECT 125, 'Sally'

对于SQL Server 2008,可以根据问题中的语句在一个VALUES子句精确地中进行(您只需添加逗号以分隔每个值语句)...


6
投票
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)

6
投票

我一直在使用以下内容:


5
投票

对应于INSERT INTO [TableName] (ID, Name) values (NEWID(), NEWID()) GO 10 (SQL Server 2005),您不能省略INSERT (Transact-SQL)且每次都必须指定它或使用其他语法/方法,


2
投票

这在SQL中非常快速且有效。假设您有表INSERT INTO dbo.Blah


0
投票

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(); }


0
投票
这里的其他人建议了几种多记录语法。对此进行说明,我建议您首先插入一个临时表,然后从那里插入主表。

500
投票

您的语法几乎在SQL Server 2008中有效(但在SQL Server 2005 1中无效:]

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 Server2005。由于我认为它仍然很重要,因此我将其保留在此处。


236
投票

如果您的数据已经在数据库中,则可以执行以下操作:

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)

24
投票

INSERT INTO ... VALUES一样使用Daniel Vassallo's语法答案有一个烦人的局限性:

来自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+开始运行

14
投票

您可以执行此操作(很丑,但是可​​行):


10
投票

这将满足您的要求:


8
投票

您可以使用联合:


6
投票

对于SQL Server 2008来说看起来不错。对于SS2005及更早版本,您需要重复VALUES语句。


6
投票

在SQL Server中使用XML插入多行会更容易,否则会变得非常乏味。

© www.soinside.com 2019 - 2024. All rights reserved.