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

SQL Server 2005:使用单个查询插入多行,sql,sql-server-2005,insert,Sql,Sql Server 2005,Insert,这应该是一个相当直截了当的问题,但我一直未能在网上找到可靠的答案。我试图在同一个表中插入多行,但只使用一条语句。我在网上看到的最流行的是以下内容,但我读到它只适用于SQL Server 2008: INSERT INTO Table (Name, Location) VALUES ('Name1', 'Location1'), ('Name2', 'Location2'), ('Name3', 'Location3'), etc... 如果能与SQLServer2005一起使用,我更喜欢这种方

这应该是一个相当直截了当的问题,但我一直未能在网上找到可靠的答案。我试图在同一个表中插入多行,但只使用一条语句。我在网上看到的最流行的是以下内容,但我读到它只适用于SQL Server 2008:

INSERT INTO Table (Name, Location) VALUES
('Name1', 'Location1'),
('Name2', 'Location2'),
('Name3', 'Location3'), etc...
如果能与SQLServer2005一起使用,我更喜欢这种方法,但我认为不会。另一个选项,从我所读到的内容来看,与插入后UNION ALL的以下SELECT语句有关,看起来很笨拙。有人知道2005年最好的语法吗


谢谢。

是的。您必须在SQL Server 2005中使用
UNION ALL
s在一条语句中插入SQL脚本中的多行

INSERT INTO Table 
  (Name, Location) 
SELECT 'Name1', 'Location1' 
UNION ALL
SELECT 'Name2', 'Location2'
UNION ALL
SELECT 'Name3', 'Location3' 
另一个主要的替代方法是多次重复
Insert
语句,这会更加冗长。在最后一种情况下,您需要小心使用显式事务,以避免许多单独提交的开销(当然,出于原子性原因)

如果有很多行要插入,可以使用一条语句从分隔文件中加载所有行

INSERT INTO Table 
  (Name, Location) 
SELECT 'Name1', 'Location1' 
UNION ALL
SELECT 'Name2', 'Location2'
UNION ALL
SELECT 'Name3', 'Location3' 

最后,如果这是您正在编写脚本的数据库中已有的数据(可能要部署到另一台服务器上),则加载项有一个“生成插入语句”功能,可以为您生成这些语句。

您必须使用sql server 2005中的
union all
。老实说,那太笨重和难看了,如果我是你,我会使用多个
插入。将它们包装在一个事务中,结果也是一样。

是的,它们是您唯一的选择,除非您插入大量数据,并且可能希望探索批量插入

INSERT INTO Table (Name, Location)
SELECT 'Name1', 'Location1' UNION ALL
SELECT 'Name2', 'Location2' UNION ALL
SELECT 'Name3', 'Location3' 

正如其他人所说,这里的关键是
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; 

由于MSSQLServer2005支持XML,我建议最好的方法是使用XML类型的输入参数的存储过程。 如果使用.NET,可以使用ds.GetXml()方法轻松地将数据集转换为xml字符串,并可以将其发送到SP

CREATE PROCEDURE [dbo].[insertLocation](@XML XML=NULL)
AS
BEGIN
  INSERT INTO [dbo].[TheLocations]
        ( [Name], [Location] )
   SELECT
        XTab.value('Name[1]','nvarchar(100)') AS[Name],
        XTab.value('Location[1]','nvarchar(200)') AS[Location]
    FROM @XML.nodes('TheLocations') XTab([XTab])
END

作为记录,您介意用UNION ALL键入一个示例吗?