Каков наилучший способ автоматического создания операторов INSERT для таблицы SQL Server? - PullRequest
535 голосов
/ 11 июня 2009

Мы пишем новое приложение, и во время тестирования нам понадобится куча фиктивных данных. Я добавил эти данные с помощью MS Access для выгрузки файлов Excel в соответствующие таблицы.

Время от времени мы хотим «обновить» соответствующие таблицы, что означает удаление их всех, их повторное создание и запуск сохраненного запроса на добавление MS Access.

Первая часть (удаление и повторное создание) представляет собой простой сценарий sql, но последняя часть заставляет меня съеживаться. Я хочу один сценарий установки, который имеет набор вставок для восстановления фиктивных данных.

У меня есть данные в таблицах. Каков наилучший способ автоматически создать большой список операторов INSERT из этого набора данных?

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

Я использую Management Studio 2008 для подключения к базе данных SQL Server 2005.

Ответы [ 20 ]

929 голосов
/ 22 августа 2009

Microsoft должна рекламировать эту функцию SSMS 2008. Функция, которую вы ищете, встроена в утилиту Generate Script , но эта функция отключена по умолчанию и должна быть включена при создании сценариев таблицы.

Это быстрый способ создания операторов INSERT для всех данных в вашей таблице без использования сценариев или надстроек к SQL Management Studio 2008:

  1. Щелкните правой кнопкой мыши базу данных и перейдите к Задачи > Создание сценариев .
  2. Выберите таблицы (или объекты), для которых вы хотите сгенерировать скрипт.
  3. Перейдите на Настройка параметров сценария и нажмите кнопку Дополнительно .
  4. В категории General перейдите к Тип данных для сценария
  5. Существует 3 варианта: Только схема , Только данные и Схема и данные . Выберите соответствующую опцию и нажмите OK .

Затем вы получите оператор CREATE TABLE и все операторы INSERT для данных прямо из SSMS.

82 голосов
/ 11 июня 2009

Мы используем эту хранимую процедуру - она ​​позволяет вам ориентироваться на конкретные таблицы и использовать предложения where. Вы можете найти текст здесь .

Например, он позволяет вам сделать это:

EXEC sp_generate_inserts 'titles'
41 голосов
/ 02 декабря 2010

Как упомянуто @Mike Ritacco, но обновлено для SSMS 2008 R2

  1. Щелкните правой кнопкой мыши на имени базы данных
  2. Выберите Задачи> Создать сценарии
  3. В зависимости от ваших настроек страница вступления может отображаться или нет
  4. Выберите «Выбрать конкретные объекты базы данных»,
  5. Развернуть древовидное представление и проверить соответствующие таблицы
  6. Нажмите Далее
  7. Нажмите Дополнительно
  8. В разделе «Общие» выберите соответствующий параметр «Типы данных для сценария»
  9. Завершить работу мастера

Затем вы получите все операторы INSERT для данных прямо из SSMS.

РЕДАКТИРОВАТЬ 2016-10-25 SQL Server 2016 / SSMS 13.0.15900.1

  1. Щелкните правой кнопкой мыши на имени базы данных

  2. Выберите Задачи> Создать сценарии

  3. В зависимости от ваших настроек страница вступления может отображаться или нет

  4. Выберите «Выбрать конкретные объекты базы данных»,

  5. Разверните древовидное представление и проверьте соответствующие таблицы

  6. Нажмите Далее

  7. Нажмите Дополнительно

  8. В разделе «Общие» выберите соответствующий параметр «Типы данных для Скрипт '

  9. Нажмите OK

  10. Укажите, хотите ли вы, чтобы выходные данные переходили на новый запрос, в буфер обмена или файл

  11. Нажмите Next дважды

  12. Ваш сценарий подготовлен в соответствии с настройками, которые вы выбрали выше

  13. Нажмите Готово

34 голосов
/ 05 апреля 2016

Это также можно сделать с помощью Visual Studio (по крайней мере, в версии 2013 года).

В VS 2013 также возможно отфильтровать список строк, на которых основан оператор вставок, что, как я знаю, в SSMS невозможно,

Выполните следующие шаги:

  • Открыть окно «Обозреватель объектов SQL Server» (меню: / Вид / Обозреватель объектов SQL Server)
  • Открытие / расширение базы данных и ее таблиц
  • Щелкните правой кнопкой мыши по таблице и выберите «Просмотр данных» из контекстного меню
  • Это отобразит данные в основной области
  • Необязательный шаг: щелкните значок фильтра «Сортировать и отфильтровать набор данных» (четвертый значок слева в строке над результатом) и применить фильтр к одному или нескольким столбцам
  • Нажмите на значки «Скрипт» или «Скрипт в файл» (значки справа в верхнем ряду выглядят как маленькие листочки бумаги)

Это создаст (условные) операторы вставки для выбранной таблицы в активное окно или файл.


Кнопки «Фильтр» и «Скрипт» Visual Studio 2013 :

enter image description here

27 голосов
/ 12 июля 2009

Вы можете использовать SSMS Tools Pack (доступно для SQL Server 2005 и 2008). Он поставляется с функцией генерации операторов вставки.

http://www.ssmstoolspack.com/

23 голосов
/ 05 апреля 2012

Я использую SSMS 2008 версии 10.0.5500.0. В этой версии в составе мастера создания сценариев вместо кнопки «Дополнительно» имеется экран ниже. В этом случае я хотел вставить только данные и не создавать операторы, поэтому мне пришлось изменить два обведенных кружком свойства Script Options

13 голосов
/ 20 июля 2009

Хранимая процедура Джейн Даллауэй: http://docs.google.com/leaf?id=0B_AkC4ZdTI9tNWVmZWU3NzAtMWY1My00NjgwLWI3ZjQtMTY1NDMxYzBhYzgx&hl=en_GB. Документация представляет собой серию постов в блоге: https://www.google.com/search?q=spu_generateinsert&as_sitesearch=http%3A%2F%2Fjane.dallaway.com

9 голосов
/ 11 июня 2009

Первая ссылка на sp_generate_inserts довольно крутая, вот действительно простая версия:

DECLARE @Fields VARCHAR(max); SET @Fields = '[QueueName], [iSort]' -- your fields, keep []
DECLARE @Table  VARCHAR(max); SET @Table  = 'Queues'               -- your table

DECLARE @SQL    VARCHAR(max)
SET @SQL = 'DECLARE @S VARCHAR(MAX)
SELECT @S = ISNULL(@S + '' UNION '', ''INSERT INTO ' + @Table + '(' + @Fields + ')'') + CHAR(13) + CHAR(10) + 
 ''SELECT '' + ' + REPLACE(REPLACE(REPLACE(@Fields, ',', ' + '', '' + '), '[', ''''''''' + CAST('),']',' AS VARCHAR(max)) + ''''''''') +' FROM ' + @Table + '
PRINT @S'

EXEC (@SQL)

В моей системе я получаю такой результат:

INSERT INTO Queues([QueueName], [iSort])
SELECT 'WD: Auto Capture', '10' UNION 
SELECT 'Car/Lar', '11' UNION 
SELECT 'Scan Line', '21' UNION 
SELECT 'OCR', '22' UNION 
SELECT 'Dynamic Template', '23' UNION 
SELECT 'Fix MICR', '41' UNION 
SELECT 'Fix MICR (Supervisor)', '42' UNION 
SELECT 'Foreign MICR', '43' UNION 
...
7 голосов
/ 22 апреля 2015

Мой вклад в решение этой проблемы - генератор сценариев Powershell INSERT, который позволяет создавать сценарии для нескольких таблиц без необходимости использовать громоздкий графический интерфейс SSMS. Отлично подходит для быстрого сохранения «начальных» данных в системе контроля версий.

  1. Сохраните приведенный ниже скрипт как "filename.ps1".
  2. Сделайте свои собственные модификации в областях под "CUSTOMIZE ME".
  3. Вы можете добавить список таблиц в скрипт в любом порядке.
  4. Вы можете открыть скрипт в Powershell ISE и нажать кнопку «Воспроизвести» или просто запустить скрипт в командной строке Powershell.

По умолчанию сгенерированный скрипт INSERT будет «SeedData.sql» в той же папке, что и скрипт.

Вам понадобятся установленные сборки объектов управления SQL Server, которые должны быть там, если у вас установлена ​​SSMS.

Add-Type -AssemblyName ("Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")
Add-Type -AssemblyName ("Microsoft.SqlServer.ConnectionInfo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91")



#CUSTOMIZE ME
$outputFile = ".\SeedData.sql"
$connectionString = "Data Source=.;Initial Catalog=mydb;Integrated Security=True;"



$sqlConnection = new-object System.Data.SqlClient.SqlConnection($connectionString)
$conn = new-object Microsoft.SqlServer.Management.Common.ServerConnection($sqlConnection)
$srv = new-object Microsoft.SqlServer.Management.Smo.Server($conn)
$db = $srv.Databases[$srv.ConnectionContext.DatabaseName]
$scr = New-Object Microsoft.SqlServer.Management.Smo.Scripter $srv
$scr.Options.FileName = $outputFile
$scr.Options.AppendToFile = $false
$scr.Options.ScriptSchema = $false
$scr.Options.ScriptData = $true
$scr.Options.NoCommandTerminator = $true

$tables = New-Object Microsoft.SqlServer.Management.Smo.UrnCollection



#CUSTOMIZE ME
$tables.Add($db.Tables["Category"].Urn)
$tables.Add($db.Tables["Product"].Urn)
$tables.Add($db.Tables["Vendor"].Urn)



[void]$scr.EnumScript($tables)

$sqlConnection.Close()
7 голосов
/ 06 декабря 2015

Если вам нужен программный доступ, вы можете использовать хранимую процедуру с открытым исходным кодом `GenerateInsert.

Генератор операторов INSERT

В качестве простого и быстрого примера для создания операторов INSERT для таблицы AdventureWorks.Person.AddressType выполните следующие операторы:

USE [AdventureWorks];
GO
EXECUTE dbo.GenerateInsert @ObjectName = N'Person.AddressType';

Это сгенерирует следующий скрипт:

SET NOCOUNT ON
SET IDENTITY_INSERT Person.AddressType ON
INSERT INTO Person.AddressType
([AddressTypeID],[Name],[rowguid],[ModifiedDate])
VALUES
 (1,N'Billing','B84F78B1-4EFE-4A0E-8CB7-70E9F112F886',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(2,N'Home','41BC2FF6-F0FC-475F-8EB9-CEC0805AA0F2',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(3,N'Main Office','8EEEC28C-07A2-4FB9-AD0A-42D4A0BBC575',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(4,N'Primary','24CB3088-4345-47C4-86C5-17B535133D1E',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(5,N'Shipping','B29DA3F8-19A3-47DA-9DAA-15C84F4A83A5',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
,(6,N'Archive','A67F238A-5BA2-444B-966C-0467ED9C427F',CONVERT(datetime,'2002-06-01 00:00:00.000',121))
SET IDENTITY_INSERT Person.AddressType OFF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...