Подтвердить что ты не робот

SQL Server 2005: добавьте несколько строк с одним запросом

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

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

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

Спасибо.

4b9b3361

Ответ 1

Угу. Вы должны использовать UNION ALL в SQL Server 2005 для вставки нескольких строк в SQL script в один оператор.

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

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

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

Наконец, если это данные уже в базе данных, которую вы создаете скрипт (возможно, для развертывания на другом сервере), SSMS Tools Pack addin имеет a "Генерировать вставки", которая может генерировать эти инструкции для вас.

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Так как MS SQLServer 2005 поддерживает XML, лучшим методом, который я бы предложил, является STORED PROCEDURE с входным параметром типа 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