SQL Server 2005:使用单个查询插入多行

Meg*_*att 16 sql sql-server-2005 insert

这应该是一个相当简单的问题,但我无法在网上找到一个可靠的答案.我试图在同一个表中插入多行,但只有一个语句.我在网上看到的最流行的是以下内容,但我读过它只适用于SQL Server 2008:

INSERT INTO Table (Name, Location) VALUES
('Name1', 'Location1'),
('Name2', 'Location2'),
('Name3', 'Location3'), etc...
Run Code Online (Sandbox Code Playgroud)

我更喜欢这种方法,如果它适用于SQL Server 2005,但我不认为它会.另外一个选项,从我读过的,与INSION之后的UNION ALL后面的SELECT语句有关,这看起来很笨拙.有谁知道在2005年做到这一点的最佳语法?

谢谢.

Mar*_*ith 22

是的.您必须UNION ALL在SQL Server 2005中使用s在单个语句中的SQL脚本中插入多行.

INSERT INTO Table 
  (Name, Location) 
SELECT 'Name1', 'Location1' 
UNION ALL
SELECT 'Name2', 'Location2'
UNION ALL
SELECT 'Name3', 'Location3' 
Run Code Online (Sandbox Code Playgroud)

另一个主要的选择是Insert多次重复该语句,这更加冗长.在最后一种情况下,您需要小心使用显式事务,以避免许多单独提交的开销(当然还有原子性原因)

如果要插入大量行,可以使用BULK INSERT在一个语句中从分隔文件中加载所有行.

最后,如果这是您正在编写脚本的数据库中的数据(可能是在另一台服务器上部署),则SSMS工具包插件具有"生成插入语句"功能,可以为您生成这些语句.


one*_*hen 5

正如其他人所说,关键在于UNION ALL.对我来说,使用CTE让事情看起来更清洁,例如

WITH NewStuff (Name, Location)
     AS
     (
      SELECT 'Name1', 'Location1' UNION ALL
      SELECT 'Name2', 'Location2' UNION ALL
      SELECT 'Name3', 'Location3' 
     )
INSERT INTO Stuff (Name, Location) 
SELECT Name, Location
  FROM NewStuff; 
Run Code Online (Sandbox Code Playgroud)