这应该是一个相当简单的问题,但我无法在网上找到可靠的答案。我试图在同一个表中插入多行,但只有一个语句。我在网上看到的最流行的是以下内容,但我读过它只适用于SQL Server 2008:
INSERT INTO Table (Name, Location) VALUES
('Name1', 'Location1'),
('Name2', 'Location2'),
('Name3', 'Location3'), etc...
如果它适用于SQL Server 2005,我更喜欢这种方法,但我认为不会。另外一个选项,从我读过的,与INSION之后的UNION ALL后面的SELECT语句有关,这看起来很笨拙。有谁知道在2005年做到这一点的最佳语法?
感谢。
答案 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