开发者

Sql Server Script data: SMO.Scripter not working when output to file

开发者 https://www.devze.com 2023-01-19 10:57 出处:网络
I get this error message when I run the Powershell script at the bottom: Exception calling \"EnumScript\" with \"1\" argument(s): \"Script failed for Table \'dbo.Product\'. \"

I get this error message when I run the Powershell script at the bottom:

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 }

However, when I comment out the output_file line

开发者_如何学运维
#$output_file="C:\Product.sql"

(which won't set the Scripter options to write to file), it works fine and outputs the INSERT statments to the console.


Here's the failing script, is there something I'm missing?

# 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 }


I ran both yours and Keith's and it looks like the issue is in the path you are setting for the file. I was able to reproduce your error. You were using $output_file="C:\Product.sql". Then I changed the path to: $output_file="$home\Product.sql" it ran just fine and gave me the file.

I am guessing that the reason for this is that I don't have permission to write to c:\ which may be the problem you are having.

BTW - my home dir in this case for me is my user folder for my login so I was able to find it there.


FWIW I'm not able to repro the error you see using the AdventureWorks DB. The following generates the foo.sql file without any errors:

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 } 
0

精彩评论

暂无评论...
验证码 换一张
取 消