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

17

这应该是一个非常简单的问题,但我在网上找不到一个确切的答案。我正在尝试使用一个语句将多行插入到同一个表中。我在网上看到的最流行的方法是下面这个,但我读到它只适用于SQL Server 2008:

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

如果这种方法适用于SQL Server 2005,我更喜欢它,但我认为它不会生效。从我所读的内容来看,另一种选择与在插入后使用UNION ALL后跟SELECT语句有关,这似乎很笨重。有没有人确切地知道在2005年中执行此操作的最佳语法?

谢谢。

5个回答

24

是的,在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
请问,您能否打出一个使用 UNION ALL 的示例? - Matt

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; 

4

在 SQL Server 2005 中,您必须使用 union all。但说实话,这个方法有些笨拙且不美观,如果我是您,我会选择多次使用 inserts。将它们包装在单个事务中,最终效果是一样的。


1

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

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

0

由于MS SQLServer 2005最好支持XML,我建议使用一个带有XML类型输入参数的存储过程作为最佳方法。 如果您正在使用.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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接