2010-07-17 126 views
16

這應該是一個相當直接的問題,但我一直無法在網上找到可靠的答案。我試圖插入多行到同一個表中,但只有一個語句。最流行的,我在網上看到的是下面的,但我讀過,它僅與SQL Server 2008工作:SQL Server 2005:用單個查詢插入多行

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

我喜歡這種方法,如果將與SQL Server 2005的工作,但我不要以爲會。另一種選擇,從我讀過的,與INSERT之後的UNION ALL的後面的SELECT語句有關,這看起來很笨重。有沒有人知道2005年的最佳語法?

謝謝。

回答

21

是的。您必須在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 Tools Pack插件具有「生成INSERT語句」功能,可以生成這些報表爲您服務。

+1

根據記錄,你會介意打字使用UNION的例子所有? – 2010-07-17 17:21:09

3

你必須在sql server 2005中使用union all。說實話,這是如此笨重和醜陋,我只是使用多個inserts,如果我是你。把它們包裝在一個單獨的交易中,最後它是一回事。

1

是的,他們是你唯一的選擇,除非你插入大量數據,可能要探索BULK INSERT

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

正如其他人所說,這裏的關鍵是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; 
0

由於MS SQLServer 2005支持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