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

by Alexey Knyazev 25. января 2010 21: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

Комментарии

14.04.2011 16:55:52 #

AgeNT

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

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

AgeNT Украина

21.04.2011 21:52:48 #

Alexey Knyazev

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

Alexey Knyazev Россия

21.04.2011 22:07:58 #

AgeNT

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

AgeNT Украина

28.04.2011 13:38:18 #

AgeNT

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

AgeNT Украина

06.05.2011 14:38:44 #

AgeNT

Не помогает Frown

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

AgeNT Украина

13.05.2011 16:43:48 #

AgeNT

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

AgeNT Украина

19.05.2011 16:39:14 #

Alexey Knyazev

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

Alexey Knyazev Россия

19.05.2011 18:55:14 #

AgeNT

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

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

AgeNT Украина

31.05.2011 20:46:49 #

Igor

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

Igor Беларусь

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


(Отображает Gravatar)

  Country flag

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



Powered by BlogEngine.NET 1.6.0.0
Все права защищены © T-SQL.RU | Alexey Knyazev 2008-2012