代码之家  ›  专栏  ›  技术社区  ›  Matt Anxo P

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

  •  16
  • Matt Anxo P  · 技术社区  · 14 年前

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

    谢谢。

    5 回复  |  直到 14 年前
        1
  •  23
  •   Martin Smith    14 年前

    是的。你必须使用 UNION ALL 在SQLServer2005中,在一条语句中插入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 addin有一个“Generate Insert Statements”函数,可以为您生成这些语句。

        2
  •  5
  •   onedaywhen    14 年前

    正如其他人所说,这里的关键是 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; 
    
        3
  •  4
  •   Donnie    14 年前

    union all 在SQLServer2005中。老实说,那太笨重和丑陋了,我只会用多个 inserts 如果我是你。将它们包装在一个事务中,最终也是一样的。

        4
  •  1
  •   Chris Diver    14 年前

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

    INSERT INTO Table (Name, Location)
    SELECT 'Name1', 'Location1' UNION ALL
    SELECT 'Name2', 'Location2' UNION ALL
    SELECT 'Name3', 'Location3' 
    
        5
  •  0
  •   Appyks    11 年前

    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