Как вставить несколько строк БЕЗ повторения части инструкции INSERT INTO dbo.Blah? - PullRequest
502 голосов
/ 12 апреля 2010

Я знаю, что делал это несколько лет назад, но не могу вспомнить синтаксис и не могу его найти нигде из-за загрузки тонны справочных документов и статей о "массовом импорте".

Вот что я хочу сделать, но синтаксис не совсем правильный ... пожалуйста, кто-то, кто делал это раньше, помогите мне:)

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'.

Ответы [ 13 ]

5 голосов
/ 18 сентября 2018

Это достигнет того, о чем вы спрашиваете:

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 голосов
/ 13 апреля 2010

В соответствии с INSERT (Transact-SQL) (SQL Server 2005) вы не можете пропустить INSERT INTO dbo.Blah и должны указывать его каждый раз или использовать другой синтаксис / подход,

2 голосов
/ 24 декабря 2014

Это работает очень быстро и эффективно в 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
)

Таким образом, вы не можете вставить несколько записей в эту таблицу, используя следующий запрос без повторения оператора вставки,

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();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...