繁体   English   中英

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

[英]SQL Server 2005: Insert multiple rows with single query

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

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

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

谢谢。

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

正如其他人所说,这里的关键是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; 

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

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

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

由于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM