470

私は何年も前にこれをやったことを知っている、しかし私は構文を覚えていることができない、そしてたくさんのヘルプドキュメントと「一括インポート」に関する記事を引っ張っているのでそれをどこにも見つけることができない。

これが私がやりたいことですが、構文は正確ではありません...以前にこれを行ったことのある人が、助けてください:)

INSERT INTO dbo.MyTable (ID, Name)
VALUES (123, 'Timmy'),
    (124, 'Jonny'),
    (125, 'Sally')

私はこれが閉じる正しい構文です。そこに「BULK」という言葉が必要かもしれませんが、覚えていません。何か案が?

SQL Server 2005データベースにはこれが必要です。私はこのコードを試してみましたが、役に立ちませんでした。

DECLARE @blah TABLE
(
    ID INT NOT NULL PRIMARY KEY,
    Name VARCHAR(100) NOT NULL
)

INSERT INTO @blah (ID, Name)
    VALUES (123, 'Timmy')
    VALUES (124, 'Jonny')
    VALUES (125, 'Sally')

SELECT * FROM @blah

なってますIncorrect syntax near the keyword 'VALUES'.


  • 上記のコードは問題ありません、'、'を追加するだけです。値ステートメントの後 - sam
  • @blah(ID、Name)、VALUES(123、' Timmy')、VALUES(124、' Jonny')、VALUES(125、' Sally')に挿入します。 ) - sam
  • 注意してください。この方法でしか挿入できないのは最大1000行です。 #Test(LWPurchaseOrderID)値に挿入(935791)、(935933) - Anoop Verma
  • 2005年はサポートされなくなりました。 2008年、2012年、2016年にはほとんどあなたが置いたものを使うINSERT INTO @blah (ID, Name) VALUES (123, 'Timmy'), (124, 'Jonny'), (125, 'Sally') "値"一度だけ表示され、セット間にコンマが必要です。 - J. Chris Compton

13 답변


297

INSERT INTO dbo.MyTable (ID, Name)
SELECT 123, 'Timmy'
UNION ALL
SELECT 124, 'Jonny'
UNION ALL
SELECT 125, 'Sally'

SQL Server 2008では、1つのVALUES句で実行できますまさにあなたの質問の中のステートメントに従って(あなたはただ各値のステートメントを区切るためにコンマを追加する必要があります)...


  • これは複数のINSERTステートメントを使用するよりも効率的ですか? - Code Commander
  • @コード司令官:いいえ、それはコンパイルするために長いです。はい、あなたは1つの挿入物だけを持っているという点で。しかし、それは質問に答えます。INSERT table (columnlist) - gbn
  • @VoidKing私はこれが半年後にやってくることを知っています、そしてあなたはずっと前にこれを考え出したかもしれません、しかしそれは本当に非常に簡単です。を使ってselect列と行を含むセットを作成すると、設計によってこれらの行は次のようになります。insert同数の列を持つ別のテーブルに追加します。リテラルと値を組み合わせて使用することもできます。たとえば、insertselect 'A', ID from ATable&Aを挿入します。最初の列には毎回、2番目の列にはATableの対応する行のID列の値が入ります。 - MarioDS
  • これはDB2との連携でもあります。DB2は時代遅れの技術にとらわれている私たちにとって重要な副次的なものです。 SQL Server 2008以降で作業しているユーザーにとって、コンマで区切られた値のほうが私の考えでは優れています。 OPはすべての「値」を削除できます。最初のものを除いて、 - JPK
  • @ PRManあなたはバージョンSQL Server 2008の後にそれをしないだろう。言及したように... - gbn

457

あなたの文法はほとんどSQL Server 2008で動作します(しかしSQL Server 2005では動作しません)1):

CREATE TABLE MyTable (id int, name char(10));

INSERT INTO MyTable (id, name) VALUES (1, 'Bob'), (2, 'Peter'), (3, 'Joe');

SELECT * FROM MyTable;

id |  name
---+---------
1  |  Bob       
2  |  Peter     
3  |  Joe       

1質問が回答されたとき、その質問がSQL Server 2005に関するものであることは明らかにされていませんでした。


  • しかし、SQL Server 2005にはありません。msdn.microsoft.com/ja-jp/library/ms174335.aspx注:SQL Server 2008では、単一のINSERTステートメントで複数の行を指定するためのTransact-SQL行コンストラクター(テーブル値コンストラクターとも呼ばれます)が導入されました。 - abatishchev
  • @abatishchev:はい、でも質問に回答してから(投稿から4分後に)、質問に' sql-server-2005'というタグが付けられませんでした。実際、OPは後で投稿を編集してこれを指定していますが、'編集'から明らかです。ラベル。元の質問は単に' tsql'とタグ付けされていました。 - Daniel Vassallo
  • Server 2008は、この方法で挿入された1000を超える行を許可しません。 - Michael
  • 1つの値セットに問題があるとどうなりますか。すべての挿入物がロールバックするのでしょうか、それとも単に不完全な行だけでしょうか。 - netblognet
  • @netblognet私はちょうど欠陥のある行だけが挿入されないことをテストしました(他のすべてのものは正しく挿入されます)。 - Mauricio Gracia Gutierrez

216

あなたのデータがすでにあなたのデータベースにあるならば、あなたはすることができます:

INSERT INTO MyTable(ID, Name)
SELECT ID, NAME FROM OtherTable

データをハードコーディングする必要がある場合は、SQL 2008以降のバージョンで次のことを実行できます。

INSERT INTO MyTable (Name, ID)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)


16

を使うINSERT INTO ... VALUESのような構文ダニエル・ヴァッサッロ回答 迷惑な制限が1つあります。

からMSDN

VALUESリストに直接行を挿入して構成できる最大行数は、次のとおりです。1000年

この制限を省略する最も簡単な方法は、次のような派生テーブルを使用することです。

INSERT INTO dbo.Mytable(ID, Name)
SELECT ID, Name 
FROM (
   VALUES (1, 'a'),
          (2, 'b'),
          --...
          -- more than 1000 rows
)sub (ID, Name);

LiveDemo


これはSQL Server 2008以降から動作します。


  • この' sub'に関する記事へのリンクを持ってもいいですか。構文。 - CodeCamper
  • @CodeCamperdocs.microsoft.com/en-us/sql/t-sql/queries/…セクション:C. Specifying multiple values as a derived table in a FROM clause - Lukasz Szozda
  • この答えの利点は、それを繰り返さずに同一の値を指定する方法を提供することです(これが私が探していたものです)。例えば。同じ3番目の列がある場合は、1000回繰り返す必要はありません。 - Vadim Berman
  • @VadimBermanはい、テーブルにデフォルトが定義されていない場合は良いシナリオです。 - Lukasz Szozda

13

あなたはこれを行うことができます(醜いがそれはうまくいきます)

INSERT INTO dbo.MyTable (ID, Name) 
select * from
(
 select 123, 'Timmy'
  union all
 select 124, 'Jonny' 
  union all
 select 125, 'Sally'
 ...
) x


8

あなたは共用体を使うことができます:

INSERT INTO dbo.MyTable (ID, Name) 
SELECT ID, Name FROM (
    SELECT 123, 'Timmy'
    UNION ALL
    SELECT 124, 'Jonny'
    UNION ALL
    SELECT 125, 'Sally'
) AS X (ID, Name)


6

これはSQL Server 2008では問題ないようです。先に、VALUES命令を繰り返す必要があります。

INSERT INTO dbo.MyTable (ID, Name)  
VALUES (123, 'Timmy')  
VALUES (124, 'Jonny')   
VALUES (125, 'Sally')  

編集::私の悪いSS2005では、行ごとに 'INSERT INTO'を繰り返す必要があります。

INSERT INTO dbo.MyTable (ID, Name)  
VALUES (123, 'Timmy')  
INSERT INTO dbo.MyTable (ID, Name)  
VALUES (124, 'Jonny')   
INSERT INTO dbo.MyTable (ID, Name)  
VALUES (125, 'Sally')  


6

SQL ServerでXMLを使用して複数行を挿入するほうが簡単です。そうしないと、非常に面倒になります。

ここでコードの説明付きの記事全体を見るhttp://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx

サンプルを表示するには、次のコードをSQL Serverにコピーします。

declare @test nvarchar(max)

set @test = '<topic><dialog id="1" answerId="41">
        <comment>comment 1</comment>
        </dialog>
    <dialog id="2" answerId="42" >
    <comment>comment 2</comment>
        </dialog>
    <dialog id="3" answerId="43" >
    <comment>comment 3</comment>
        </dialog>
    </topic>'

declare @testxml xml
set @testxml = cast(@test as xml)
declare @answerTemp Table(dialogid int, answerid int, comment varchar(1000))

insert @answerTemp
SELECT  ParamValues.ID.value('@id','int') ,
ParamValues.ID.value('@answerId','int') ,
ParamValues.ID.value('(comment)[1]','VARCHAR(1000)')
FROM @testxml.nodes('topic/dialog') as ParamValues(ID)


6

USE YourDB
GO
INSERT INTO MyTable (FirstCol, SecondCol)
SELECT 'First' ,1
UNION ALL
SELECT 'Second' ,2
UNION ALL
SELECT 'Third' ,3
UNION ALL
SELECT 'Fourth' ,4
UNION ALL
SELECT 'Fifth' ,5
GO

または他の方法を使用できます

INSERT INTO MyTable (FirstCol, SecondCol)
VALUES 
('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)


6

私は以下を使っています:

INSERT INTO [TableName] (ID, Name)
values (NEWID(), NEWID())
GO 10

IDと名前に一意のGUIDを持つ10行が追加されます。

注:最後の行(GO 10)を「;」で終わらないでください。エラーが発生するため、致命的なスクリプトエラーが発生しました。 GOの構文解析中に誤った構文が見つかりました。


5

対応するINSERT(Transact-SQL)(SQL Server 2005)あなたは省略することはできませんINSERT INTO dbo.Blah毎回それを指定するか、他の構文/アプローチを使用する必要があります


2

これはSQLにおいて非常に速くそして効率的に働いています。 テーブルがあるとしますSample with 4 column a,b,c,d where a,b,d are int and c column is Varchar(50)

CREATE TABLE [dbo].[Sample](
[a] [int] NULL,
[b] [int] NULL,
[c] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[D] [int] NULL
)

したがって、insert文を繰り返さずに次のクエリを使用して、このテーブル内の複数のレコードを挿入できません。

DECLARE @LIST VARCHAR(MAX)
SET @LIST='SELECT 1, 1, ''Charan Ghate'',11
     SELECT 2,2, ''Mahesh More'',12
     SELECT 3,3,''Mahesh Nikam'',13
     SELECT 4,4, ''Jay Kadam'',14'
INSERT SAMPLE (a, b, c,d) EXEC(@LIST)

C#も使ってSqlBulkCopy bulkcopy = new SqlBulkCopy(con)

一度に10行挿入できます

   DataTable dt = new DataTable();
        dt.Columns.Add("a");
        dt.Columns.Add("b");
        dt.Columns.Add("c");
        dt.Columns.Add("d");
        for (int i = 0; i < 10; i++)
        {
            DataRow dr = dt.NewRow();
            dr["a"] = 1;
            dr["b"] = 2;
            dr["c"] = "Charan";
            dr["d"] = 4;
            dt.Rows.Add(dr);
        }
        SqlConnection con = new SqlConnection("Connection String");
        using (SqlBulkCopy bulkcopy = new SqlBulkCopy(con))
        {
            con.Open();
            bulkcopy.DestinationTableName = "Sample";
            bulkcopy.WriteToServer(dt);
            con.Close();
        }


1

これにより、あなたが求めていることが達成されます。

INSERT INTO table1 (ID, Name)
    VALUES (123, 'Timmy'), 
           (124, 'Jonny'), 
           (125, 'Sally');

将来の開発者にとっては、別のテーブルから挿入

INSERT INTO table1 (ID, Name)
    SELECT 
         ID, 
         Name 
    FROM table2

あるいは複数のテーブルから

INSERT INTO table1 (column2, column3)
    SELECT 
         t2.column, 
         t3.column
    FROM table2 t2
         INNER JOIN table3 t3
         ON t2.ID = t3.ID

リンクされた質問


関連する質問

最近の質問