Как вставить несколько строк БЕЗ повторения части инструкции 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 ]

484 голосов
/ 12 апреля 2010

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

313 голосов
/ 12 апреля 2010
INSERT INTO dbo.MyTable (ID, Name)
SELECT 123, 'Timmy'
UNION ALL
SELECT 124, 'Jonny'
UNION ALL
SELECT 125, 'Sally'

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

227 голосов
/ 12 апреля 2010

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

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)
19 голосов
/ 09 марта 2017

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

С MSDN

Максимальное количество строк, которое можно построить путем вставки строк непосредственно в список ЗНАЧЕНИЙ, составляет 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 +
13 голосов
/ 12 апреля 2010

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

INSERT INTO dbo.MyTable (ID, Name) 
select * from
(
 select 123, 'Timmy'
  union all
 select 124, 'Jonny' 
  union all
 select 125, 'Sally'
 ...
) x
8 голосов
/ 12 апреля 2010

Вы можете использовать союз:

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 голосов
/ 28 марта 2016

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

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

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

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

6 голосов
/ 02 декабря 2011
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 голосов
/ 02 декабря 2011

Было бы проще использовать 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)
6 голосов
/ 12 апреля 2010

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

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

РЕДАКТИРОВАТЬ :: Мой плохой. Вы должны повторить «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')  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...