これはかなり簡単な質問ですが、オンラインで確実な答えを見つけることができませんでした。同じテーブルに複数の行を挿入しようとしていますが、ステートメントは1つだけです。私がオンラインで見た中で最も人気のあるものは次のとおりですが、SQL Server2008でのみ機能することを読みました。
INSERT INTO Table (Name, Location) VALUES
('Name1', 'Location1'),
('Name2', 'Location2'),
('Name3', 'Location3'), etc...
SQL Server 2005で機能する場合は、この方法をお勧めしますが、機能しないと思います。私が読んだ他のオプションは、INSERTの後のUNION ALLの次のSELECTステートメントと関係がありますが、これは不格好なようです。 2005年にこれを行うための最良の構文を確かに知っている人はいますか?
ありがとう。
うん。 1つのステートメントでSQLスクリプトに複数の行を挿入するには、SQL Server2005でUNION ALL
sを使用する必要があります。
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」関数があります。
他の人が言っているように、ここでの鍵は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 Server2005ではunion all
を使用する必要があります。正直なところ、これは非常に不格好で醜いので、私があなたなら複数のinserts
を使用します。それらを1つのトランザクションでラップすると、最終的には同じことになります。
はい。大量のデータを挿入していて、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タイプの入力パラメーターを使用したストアドプロシージャです。 .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