簡體   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