SQL Server 2005: вставка нескольких строк одним запросом - PullRequest
16 голосов
/ 17 июля 2010

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

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

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

Спасибо.

Ответы [ 5 ]

22 голосов
/ 17 июля 2010

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

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

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

5 голосов
/ 19 июля 2010

Как уже говорили другие, ключ здесь 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; 
4 голосов
/ 17 июля 2010

Вы должны использовать union all в SQL Server 2005. Если честно, это так неуклюже и безобразно, я бы просто использовал несколько inserts на вашем месте. Оберните их в одну транзакцию, и в конце концов это одно и то же.

1 голос
/ 17 июля 2010

Да, это ваши единственные варианты, если вы не вставляете много данных и не хотите исследовать BULK INSERT

INSERT INTO Table (Name, Location)
SELECT 'Name1', 'Location1' UNION ALL
SELECT 'Name2', 'Location2' UNION ALL
SELECT 'Name3', 'Location3' 
0 голосов
/ 16 июня 2013

Поскольку MS SQLServer 2005 поддерживает XML, лучший способ, который я бы предложил, - это СОХРАНЕННАЯ ПРОЦЕДУРА с входным параметром типа XML.Если вы работаете с .NET, вы можете легко преобразовать DataSet в строку XML с помощью метода ds.GetXml () и отправить его в SP

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