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

Tim*_*uri 518 t-sql sql-server sql-server-2005 insert

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

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

INSERT INTO dbo.MyTable (ID, Name)
VALUES (123, 'Timmy'),
    (124, 'Jonny'),
    (125, 'Sally')
Run Code Online (Sandbox Code Playgroud)

我知道这接近正确的语法.我可能在那里需要"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
Run Code Online (Sandbox Code Playgroud)

我越来越 Incorrect syntax near the keyword 'VALUES'.

Dan*_*llo 496

您的语法几乎适用于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       
Run Code Online (Sandbox Code Playgroud)

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

  • Server 2008不允许以这种方式插入超过1000行. (27认同)
  • @netblognet我刚刚测试了没有插入错误的行(所有其他所有行都正确插入了) (2认同)

gbn*_*gbn 323

INSERT INTO dbo.MyTable (ID, Name)
SELECT 123, 'Timmy'
UNION ALL
SELECT 124, 'Jonny'
UNION ALL
SELECT 125, 'Sally'
Run Code Online (Sandbox Code Playgroud)

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

  • 这比使用多个INSERT语句更有效吗? (9认同)
  • @Code Commander:不,因为它编译的时间更长.是的,因为你只有一个插页.但它回答了这个问题:不重复`INSERT表(列表)` (6认同)
  • @VoidKing我知道这是半年之后的事情你可能很久以前就想到了这一点,但它真的很简单.通过使用`select`,您可以创建一个包含列和行的集合,并且通过设计,这些行可以"插入"具有相同数量列的另一个表.您甚至可以使用文字和值的混合.例如,使用带有`select'A'的`insert`,来自ATable`的ID将每次在第一列中插入'A',在第二列中插入相应的ATable行的ID列值. (3认同)

Geo*_*rge 235

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

INSERT INTO MyTable(ID, Name)
SELECT ID, NAME FROM OtherTable
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO MyTable (Name, ID)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
Run Code Online (Sandbox Code Playgroud)


Luk*_*zda 23

使用Daniel Vassallo的答案中的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);
Run Code Online (Sandbox Code Playgroud)

LiveDemo


这将从SQL Server 2008+开始

  • @CodeCamper https://docs.microsoft.com/en-us/sql/t-sql/queries/table-value-constructor-transact-sql 部分:`C. 在 FROM 子句中将多个值指定为派生表 (3认同)
  • 该答案的优点在于,它提供了一种无需重复就可以指定相同值的方法(这正是我所寻找的)。例如,如果第三列相同,则无需重复一千次。 (2认同)

dav*_*vek 14

你可以做到这一点(丑陋但它有效):

INSERT INTO dbo.MyTable (ID, Name) 
select * from
(
 select 123, 'Timmy'
  union all
 select 124, 'Jonny' 
  union all
 select 125, 'Sally'
 ...
) x
Run Code Online (Sandbox Code Playgroud)


Tig*_*z32 10

这将实现您所要求的:

INSERT INTO table1 (ID, Name)
    VALUES (123, 'Timmy'), 
           (124, 'Jonny'), 
           (125, 'Sally');
Run Code Online (Sandbox Code Playgroud)

对于将来的开发人员,您还可以从另一个表插入

INSERT INTO table1 (ID, Name)
    SELECT 
         ID, 
         Name 
    FROM table2
Run Code Online (Sandbox Code Playgroud)

甚至从多个表

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


Cad*_*oux 8

你可以使用一个联盟:

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)
Run Code Online (Sandbox Code Playgroud)


Dav*_*veE 6

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

INSERT INTO dbo.MyTable (ID, Name)  
VALUES (123, 'Timmy')  
VALUES (124, 'Jonny')   
VALUES (125, 'Sally')  
Run Code Online (Sandbox Code Playgroud)

编辑::我的坏.你必须为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')  
Run Code Online (Sandbox Code Playgroud)


小智 6

在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)
Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)

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

INSERT INTO MyTable (FirstCol, SecondCol)
VALUES 
('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
Run Code Online (Sandbox Code Playgroud)


val*_*nvs 6

我一直在使用以下内容:

INSERT INTO [TableName] (ID, Name)
values (NEWID(), NEWID())
GO 10
Run Code Online (Sandbox Code Playgroud)

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

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


aba*_*hev 5

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