2010-07-17 5 views
16

Это должен быть довольно простой вопрос, но я не смог найти надежный ответ в Интернете. Я пытаюсь вставить несколько строк в одну и ту же таблицу, но только с одним утверждением. Самый популярный я видел в Интернете заключается в следующем, но я читал, что он работает только с SQL Server 2008:SQL Server 2005: добавьте несколько строк с одним запросом

INSERT INTO Table (Name, Location) VALUES 
('Name1', 'Location1'), 
('Name2', 'Location2'), 
('Name3', 'Location3'), etc... 

Я предпочел бы этот метод, если он будет работать с SQL Server 2005, но я не думаю, что так будет. Другой вариант, из того, что я прочитал, имеет отношение к UNION ALL следующим операторам SELECT после INSERT, который кажется неуклюжим. Кто-нибудь знает наверняка лучший синтаксис для этого в 2005 году?

Спасибо.

ответ

21

Да. Вы должны использовать UNION ALL s в SQL Server 2005 для вставки нескольких строк в SQL-скрипт в одном заявлении.

INSERT INTO Table 
    (Name, Location) 
SELECT 'Name1', 'Location1' 
UNION ALL 
SELECT 'Name2', 'Location2' 
UNION ALL 
SELECT 'Name3', 'Location3' 

Другой основной альтернативой является повторение несколько раз Insert заявление, которое еще более многословным. Вы должны быть осторожны, чтобы использовать Явные транзакции в этом последнем случае, чтобы избежать накладных расходов для многих отдельных коммитов (и, конечно, из соображений атомарности)

Если у вас есть много строк для вставки, вы можете использовать BULK INSERT для загрузки всего из файла с разделителями в одном выражении.

Идентификатор SSMS Tools Pack Наконец, если это данные уже в базе данных, которую вы создаете скрипт (возможно, для развертывания на другом сервере), то добавление SSMS Tools Pack имеет функцию «Создать вставки», которая может генерировать эти операторы для вас.

+1

Для записи, не могли бы вы печатали пример использования UNION ВСЕ? –

3

Вы должны использовать union all в sql server 2005. Честно говоря, это так неуклюже и уродливо, я бы использовал только несколько inserts, если бы был вами. Оберните их в одну транзакцию, и в конце концов это одно и то же.

1

Да они только ваши варианты, если вы вставляете много данных, и, возможно, захотите, чтобы исследовать BULK INSERT

INSERT INTO Table (Name, Location) 
SELECT 'Name1', 'Location1' UNION ALL 
SELECT 'Name2', 'Location2' UNION ALL 
SELECT 'Name3', 'Location3' 
5

Как уже говорили другие, ключ здесь UNION ALL. Для меня использование CTE держит вещи немного чище, например.

WITH NewStuff (Name, Location) 
    AS 
    (
     SELECT 'Name1', 'Location1' UNION ALL 
     SELECT 'Name2', 'Location2' UNION ALL 
     SELECT 'Name3', 'Location3' 
    ) 
INSERT INTO Stuff (Name, Location) 
SELECT Name, Location 
    FROM NewStuff; 
0

Так как MS SQLServer 2005 поддерживает XML лучший метод, который я предложил бы хранимую процедуру с входным параметром типа XML. Если вы работаете с .NET вы можете легко конвертировать DataSet в XML-строку, используя метод ds.GetXml() и может быть отправлены в СП

CREATE PROCEDURE [dbo].[insertLocation](@XML XML=NULL) 
AS 
BEGIN 
    INSERT INTO [dbo].[TheLocations] 
     ([Name], [Location]) 
    SELECT 
     XTab.value('Name[1]','nvarchar(100)') AS[Name], 
     XTab.value('Location[1]','nvarchar(200)') AS[Location] 
    FROM @XML.nodes('TheLocations') XTab([XTab]) 
END 
Смежные вопросы