web-dev-qa-db-ja.com

SQL Server 2005:単一のクエリで複数の行を挿入する

これはかなり簡単な質問ですが、オンラインで確実な答えを見つけることができませんでした。同じテーブルに複数の行を挿入しようとしていますが、ステートメントは1つだけです。私がオンラインで見た中で最も人気のあるものは次のとおりですが、SQL Server2008でのみ機能することを読みました。

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

SQL Server 2005で機能する場合は、この方法をお勧めしますが、機能しないと思います。私が読んだ他のオプションは、INSERTの後のUNION ALLの次のSELECTステートメントと関係がありますが、これは不格好なようです。 2005年にこれを行うための最良の構文を確かに知っている人はいますか?

ありがとう。

16
MegaMatt

うん。 1つのステートメントでSQLスクリプトに複数の行を挿入するには、SQL Server2005でUNION ALLsを使用する必要があります。

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

もう1つの主な方法は、Insertステートメントを複数回繰り返すことです。これは、さらに冗長です。この最後のケースでは、多くの個別のコミットのオーバーヘッドを回避するために、明示的なトランザクションを使用するように注意する必要があります(もちろんアトミック性の理由から)

挿入する行がたくさんある場合は、 BULK INSERT を使用して、1つのステートメントで区切られたファイルからすべてをロードできます。

最後に、これがスクリプトアウトしている(おそらく別のサーバーに展開する)データベースに既に存在するデータである場合、 SSMS Tools Pack アドインには、これらのステートメントを生成できる「GenerateInsertStatements」関数があります。

22
Martin Smith

他の人が言っているように、ここでの鍵は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; 
5
onedaywhen

SQL Server2005ではunion allを使用する必要があります。正直なところ、これは非常に不格好で醜いので、私があなたなら複数のinsertsを使用します。それらを1つのトランザクションでラップすると、最終的には同じことになります。

4
Donnie

はい。大量のデータを挿入していて、BULK INSERTを調べたい場合を除いて、これらが唯一の選択肢です。

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

MS SQLServer 2005はXMLをサポートしているので、私が提案する最良の方法は、XMLタイプの入力パラメーターを使用したスト​​アドプロシージャです。 .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
0
Appyks