2010-07-17 93 views
16

这应该是一个相当直接的问题,但我一直无法在网上找到可靠的答案。我试图插入多行到同一个表中,但只有一个语句。最流行的,我在网上看到的是下面的,但我读过,它仅与SQL Server 2008工作:SQL Server 2005:用单个查询插入多行

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

我喜欢这种方法,如果将与SQL Server 2005的工作,但我不要以为会。另一种选择,从我读过的,与INSERT之后的UNION ALL的后面的SELECT语句有关,这看起来很笨重。有没有人知道2005年的最佳语法?

谢谢。

回答

21

是的。您必须在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插件具有“生成INSERT语句”功能,可以生成这些报表为您服务。

+1

根据记录,你会介意打字使用UNION的例子所有? – 2010-07-17 17:21:09

3

你必须在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' 
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; 
0

由于MS SQLServer 2005支持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