Sql Server Script data: SMO.Scripter не работает при выводе в файл - PullRequest
1 голос
/ 08 октября 2010

Я получаю это сообщение об ошибке при запуске скрипта Powershell внизу:

Exception calling "EnumScript" with "1" argument(s): "Script failed for Table 'dbo.Product'. "
At :line:48 char:35
+ foreach ($s in $scripter.EnumScript <<<< ($tbl)) { write-host $s }

Однако, когда я закомментирую строку output_file

#$output_file="C:\Product.sql"

(который не устанавливает параметры Scripter для записи в файл), он отлично работает и выводит INSERT-статистику на консоль.


Вот неверный скрипт, я что-то упускаю?

# Script INSERTs for given table
param 
(
  [string] $server,
  [string] $database,
  [string] $schema,
  [string] $table,
  [string] $output_file
)

$server="devdidb02"
$database="EPCTrunk_EPC"
$schema="dbo"
$table="Product"
$output_file="C:\Product.sql"

[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)

# Get the database and table objects
$db = $srv.Databases[$database]
$tbl = $db.tables | Where-object {$_.schema -eq $schema-and$_.name -eq $table} 

# Set scripter options to ensure only data is scripted
$scripter.Options.ScriptSchema = $false;
$scripter.Options.ScriptData = $true;

#Exclude GOs after every line
$scripter.Options.NoCommandTerminator = $true;

if ($output_file -gt "") 
{
  $scripter.Options.FileName = $output_file
  $scripter.Options.ToFileOnly = $true
}

# Output the script
foreach ($s in $scripter.EnumScript($tbl)) { write-host $s }

Ответы [ 2 ]

3 голосов
/ 14 октября 2010

Я запустил и твои, и Кита, и похоже, что проблема в пути, который вы устанавливаете для файла. Я смог воспроизвести вашу ошибку. Вы использовали $output_file="C:\Product.sql". Затем я изменил путь на: $output_file="$home\Product.sql" он работал нормально и дал мне файл.

Я предполагаю, что причина этого в том, что у меня нет разрешения писать в c: \, что может быть вашей проблемой.

Кстати, мой домашний каталог в данном случае для меня - это папка пользователя для моего логина, поэтому я смог найти ее там.

3 голосов
/ 10 октября 2010

FWIW Я не могу воспроизвести ошибку, которую вы видите, используя AdventureWorks DB.Следующее генерирует файл foo.sql без каких-либо ошибок:

Add-Type -AssemblyName ('Microsoft.SqlServer.Smo, Version=10.0.0.0, ' + `
                        'Culture=neutral, PublicKeyToken=89845dcd8080cc91')

$serverName = '.\SQLEXPRESS'
$smo = new-object Microsoft.SqlServer.Management.Smo.Server $serverName
$db  = $smo.Databases['AdventureWorks']
$tbl = $db.Tables | Where {$_.Schema -eq 'Production' -and `
                           $_.Name -eq 'Product'}

$output_file = "$home\foo.sql"

$scripter = new-object Microsoft.SqlServer.Management.Smo.Scripter $serverName
$scripter.Options.ScriptSchema = $false; 
$scripter.Options.ScriptData = $true; 
$scripter.Options.NoCommandTerminator = $true; 

if ($output_file -gt "")  
{ 
  $scripter.Options.FileName = $output_file 
  $scripter.Options.ToFileOnly = $true 
} 

# Output the script 
foreach ($s in $scripter.EnumScript($tbl)) { write-host $s } 
...