Как вставить несколько строк без повторения части инструкции INSERT INTO dbo.Blah?

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

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

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

Ответ 1

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

Для SQL Server 2008 можно сделать это в одном предложении VALUES точно так же, как и в выражении в вашем вопросе (вам просто нужно добавить запятую, чтобы отделить каждое значение)...

Ответ 2

Ваш синтаксис почти работает в 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. Я оставляю этот ответ здесь, так как считаю, что он по-прежнему имеет значение.

Ответ 3

Если ваши данные уже находятся в вашей базе данных, вы можете:

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)

Ответ 4

Вы можете сделать это (уродливое, но оно работает):

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

Ответ 5

Вы можете использовать объединение:

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

Используя INSERT INTO ... VALUES синтаксис, например, в ответы Даниэля Вассалло есть одно раздражающее ограничение:

Из 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 +

Ответ 7

Это выглядит нормально для SQL Server 2008. Для SS2005 и ранее вам нужно повторить оператор VALUES.

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

EDIT:: Мой плохой. Вы должны повторить "INSERT INTO" для каждой строки в SS2005.

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

Ответ 8

Было бы проще использовать XML в SQL Server для вставки нескольких строк, иначе это станет очень утомительным.

Посмотреть полную статью с пояснениями здесь http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx

Скопируйте следующий код в SQL-сервер, чтобы просмотреть образец.

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)

Ответ 9

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)

Ответ 10

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

Ответ 11

Я использовал следующее:

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

Он добавит десять строк с уникальными идентификаторами GUID для ID и имени.

Примечание: не заканчивайте последнюю строку (GO 10) на ';' потому что это вызовет ошибку: произошла фатальная ошибка сценария. Неправильный синтаксис встречался при разборе GO.

Ответ 12

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

Также с помощью С# с помощью 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();
        }