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

时间:2010-07-17 17:14:36

标签: sql sql-server-2005 insert

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

INSERT INTO Table (Name, Location) VALUES
('Name1', 'Location1'),
('Name2', 'Location2'),
('Name3', 'Location3'), etc...

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

感谢。

5 个答案:

答案 0 :(得分:22)

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

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

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

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

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

答案 1 :(得分: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; 

答案 2 :(得分:4)

你必须在sql server 2005中使用union all。说实话,这是如此笨重和丑陋,如果我是你,我只会使用多个inserts。将它们包装在一个交易中,最后也是一样。

答案 3 :(得分:1)

是的,他们是您唯一的选择,除非您要插入大量数据并且可能想要探索BULK INSERT

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

答案 4 :(得分:0)

由于MS SQLServer 2005支持XML,我建议的最佳方法是使用XML类型的输入参数的STORED PROCEDURE。 如果您正在使用.NET,则可以使用ds.GetXml()方法轻松地将DataSet转换为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
相关问题