Скрипт выгрузки данных в Inserts-файл

by Alexey Knyazev 26. января 2010 00:19

В одной из своих заметок в блоге я публиковал, как можно с помощью PowerShell заскриптовать все объекты той или иной БД на сервере баз данных (Скриптуем объекты БД (PoSh) ), а на днях в коментариях в этому скрипту появился вопрос, как заскриптовать сами данные, а не только "скелет" базы.

Но прежде чем показать скрипт на PowerShell, перечислю другие возможные способы реализации данной задачи

Во первых - подумайте, действительно ли вам необходимы данные в виде файла, не проще ли (а самое главное правильнее) сделать Бэкап базы

Второй вариант - это T-SQL скрипт, т.к. в сети легко найти подобное решение, то я не стал изобретать велосипед, а предлагаю воспользоваться скриптом Narayana Vyas Kondreddi: SQL Server 2000 либо SQL Server 2005/2008

Ещё одно решение - стандартный клиент для работы с SQL Server 2005 и выше: SSMS (Microsoft SQL Server Management Studio). Для SSMS2005 - это надстройка (ADD-IN) Generate Insert statements from resultsets, tables or database из пакета дополнительных надстроек http://www.ssmstoolspack.com/

При этом в SSMS2008 подобная надстройка добавлена: Tasks->Generate Scripts..., а дальше в Wizard`e отметить, что в скрипт мы хотим включить не только объекты БД, но и данные.

Ну и вариант на PowerShell с использованием SMO:

$server=Read-Host "Укажите имя сервера БД"
$database=Read-Host "Имя БД"
$output_file=Read-Host "Вывести результат в файл (укажите имя файла)"

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | out-null

$srv = New-Object "Microsoft.SqlServer.Management.SMO.Server" $server
$db = New-Object ("Microsoft.SqlServer.Management.SMO.Database")
$tbl = New-Object ("Microsoft.SqlServer.Management.SMO.Table")
$scripter = New-Object ("Microsoft.SqlServer.Management.SMO.Scripter") ($server)

$db = $srv.Databases[$database]

$scripter.Options.ScriptSchema = $true;
$scripter.Options.ScriptData = $true;
$scripter.Options.DriAll = $true
$scripter.Options.DriAllConstraints = $true
$scripter.Options.DriAllKeys = $true
$scripter.Options.DriChecks = $true
$scripter.Options.DriClustered = $true
$scripter.Options.DriDefaults = $true
$scripter.Options.DriForeignKeys = $true
$scripter.Options.DriIncludeSystemNames = $true
$scripter.Options.DriIndexes = $true
$scripter.Options.DriNonClustered = $true
$scripter.Options.DriPrimaryKey = $true
$scripter.Options.DriUniqueKeys = $true

$scripter.Options.AppendToFile =$true

$scripter.Options.FileName = $output_file
$scripter.Options.ToFileOnly = $true

foreach ($tbl in $db.Tables)   
{   
foreach ($s in $scripter.EnumScript($tbl)) { write-host $s }   
} 

Список пар-ов ScriptingOptions, можно посмотреть на MSDN http://msdn.microsoft.com/ru-ru/library/microsoft.sqlserver.management.smo.scriptingoptions_members.aspx

Tags: , , , ,

PowerShell | SQL Server

Комментарии (10) -

AgeNT
AgeNT Ukraine
14.04.2011 19:55:52 #

Скрипт ругается:

Обнаружено несколько неоднозначных перегрузок для "EnumScript", число аргументов: "1".
insert_dynamic.ps1:39 знак:36
+ foreach ($s in $scripter.EnumScript <<<< ($tbl.Urn)) { write-host $s }
    + CategoryInfo          : NotSpecified: (Smile [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest
Я так понимаю изменился синтаксис. Что нужно подправить что-бы работало.
Заранее спасибо за ответ.

Reply

Alexey Knyazev
Alexey Knyazev Russia
22.04.2011 0:52:48 #

ОС какая? 7-ка?
Скрипт писался под WinXP+SP3+PoSh2

Reply

AgeNT
AgeNT Ukraine
22.04.2011 1:07:58 #

ОС 2008 сервер. SQL 2008
PoSH2
Скрипт работал до относительно недавнего времени. После очередного обновления PowerShell перестал работать, выдавая ошибку указанную выше.
Находил решения мол вместо строки: foreach ($s in $scripter.EnumScript($tbl.Urn))
поставить строку: foreach ($s in $scripter.EnumScript($tbl))
Результатов не дало Frown

Reply

AgeNT
AgeNT Ukraine
28.04.2011 16:38:18 #

Никто ничем помочь не может? Frown

Reply

AgeNT
AgeNT Ukraine
06.05.2011 17:38:44 #

Не помогает Frown

Отсутствует тело инструкции в цикле foreach.
insert_dynamic.ps1:34 знак:1
+  <<<< foreach ($tbl in $db.Tables)
    + CategoryInfo          : ParserError: (Smile [], ParseException
    + FullyQualifiedErrorId : MissingForeachStatement

Reply

AgeNT
AgeNT Ukraine
13.05.2011 19:43:48 #

Сорри что надоедаю, но я полный нуб в PS. Помогите плиз.

Reply

Alexey Knyazev
Alexey Knyazev Russia
19.05.2011 19:39:14 #

Обновил скрипт, попробуйте его выполнить у себя

Reply

AgeNT
AgeNT Ukraine
19.05.2011 21:55:14 #

Скрипт скопировал один в один кроме трех первых строчек.
Долго думает, затем

Обнаружено несколько неоднозначных перегрузок для "EnumScript", число аргументо
в: "1".
test.ps1:36 знак:36
+ foreach ($s in $scripter.EnumScript <<<< ($tbl)) { write-host $s }
    + CategoryInfo          : NotSpecified: (Smile [], MethodException
    + FullyQualifiedErrorId : MethodCountCouldNotFindBest

Reply

Igor
Igor Belarus
31.05.2011 23:46:49 #

Такая же проблема

Reply

Алексей
Алексей Russia
21.06.2012 0:03:30 #

foreach ($s in $scripter.EnumScript($tbl)) { write-host $s }
работает (Windows 2008 R2)

Reply

Добавить комментарий

  Country flag

biuquote
  • Комментарий
  • Предпросмотр
Loading