SQL Server 2005:使用单个查询插入多行
这应该是一个相当直截了当的问题,但我一直未能在网上找到可靠的答案。我试图在同一个表中插入多行,但只使用一条语句。我在网上看到的最流行的是以下内容,但我读到它只适用于SQL Server 2008: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一起使用,我更喜欢这种方
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键入一个示例吗?