简体   繁体   English

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

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

This should be a fairly straightforward question, but I haven't been able to find a solid answer online. 这应该是一个相当简单的问题,但我无法在网上找到一个可靠的答案。 I'm trying to insert multiple rows into the same table, but with only one statement. 我试图在同一个表中插入多行,但只有一个语句。 The most popular I've seen online is the following, but I've read that it only works with SQL Server 2008: 我在网上看到的最流行的是以下内容,但我读过它只适用于SQL Server 2008:

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

I'd prefer this method if it will work with SQL Server 2005, but I don't think it will. 我更喜欢这种方法,如果它适用于SQL Server 2005,但我不认为它会。 The other option, from what I've read, has to do with UNION ALL's following SELECT statements after the INSERT, which seems clunky. 另外一个选项,从我读过的,与INSION之后的UNION ALL后面的SELECT语句有关,这看起来很笨拙。 Does anyone know for sure the best syntax to do this in 2005? 有谁知道在2005年做到这一点的最佳语法?

Thanks. 谢谢。

Yep. 是的。 You have to use UNION ALL s in SQL Server 2005 to insert multiple rows in a SQL script in a single statement. 您必须在SQL Server 2005中使用UNION ALL在单个语句中的SQL脚本中插入多行。

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

The other main alternative is to repeat the Insert statement multiple times which is even more verbose. 另一个主要的替代方案是多次重复Insert语句,这更加冗长。 You need to be careful to use Explicit transactions in this last case to avoid the overhead of many individual commits (and for atomicity reasons of course) 在最后一种情况下,您需要小心使用显式事务,以避免许多单独提交的开销(当然还有原子性原因)

If you have lots of rows to insert you could use BULK INSERT to load it all in from a delimited file in one statement. 如果要插入大量行,可以使用BULK INSERT在一个语句中从分隔文件中加载所有行。

Finally if this is data already in the database that you are scripting out (perhaps to deploy on another server) the SSMS Tools Pack addin has a "Generate Insert Statements" function that can generate these statements for you. 最后,如果这是您正在编写脚本的数据库中的数据(可能是在另一台服务器上部署),则SSMS工具包插件具有“生成插入语句”功能,可以为您生成这些语句。

As others have said, the key here is UNION ALL . 正如其他人所说,这里的关键是UNION ALL For me, using a CTE keeps things looking a little cleaner eg 对我来说,使用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; 

You have to use the union all in sql server 2005. To be honest, that's so clunky and ugly, I'd just use multiple inserts if I were you. 你必须在sql server 2005中使用union all 。说实话,那是如此笨重和丑陋,如果我是你,我只会使用多个inserts Wrap them in a single transaction and it's the same thing in the end. 将它们包装在一个事务中,最后它也是一样的。

Yes they are your only options, unless you are inserting a lot of data and might want to explore a BULK INSERT 是的,它们是您唯一的选择,除非您要插入大量数据并且可能想要探索BULK INSERT

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

Since MS SQLServer 2005 supports XML the best method I would suggest is a STORED PROCEDURE with an input parameter of XML type. 由于MS SQLServer 2005支持XML,我建议的最好方法是使用XML类型的输入参数的STORED PROCEDURE。 If you are working with .NET you can easily convert the DataSet to xml string using ds.GetXml() method and can be sent to the SP 如果您正在使用.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