web-dev-qa-db-ja.com

ステートメントの "INSERT INTO dbo.Blah"部分を繰り返さずに複数の行を挿入する方法を教えてください。

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

これは私がやりたいことですが、構文は正確ではありません...以前にこれを行ったことのある人にお願いします:)

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

私はこれが close 正しい構文に近いことを知っています。その中に「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'.を取得しています

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

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

313
gbn

あなたの文法は、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に関するものであることは明らかにされていませんでした。

480
Daniel Vassallo

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

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)
223
George

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

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

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

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)
8
Cade Roux

これはSQL Server 2008では問題ないようです。SS2005以前では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
DaveE

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

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

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

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

6
valentinvs
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
gngolakia

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
Joe

INSERT(Transact-SQL) (SQL Server 2005)に対応するため、INSERT INTO dbo.Blahを省略して毎回指定したり、別の構文/アプローチを使用したりする必要はありません。

5
abatishchev

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

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
5
Tigerjz32

これは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();
        }
2
Charan Ghate