0

我想寫一個Powershell腳本來生成一個SQL腳本來創建我的數據庫中的存儲過程。以下是我有:如何在使用SMO腳本生成腳本時腳本化腳本?

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

Function to-array ($c) 
{ 
    foreach($item in $c) 
    { 
     $result += @($item) 
    } 
    $result 
} 

$s = new-object ('Microsoft.SqlServer.Management.Smo.Server') "LOCALHOST" 
$scrp = new-object ('Microsoft.SqlServer.Management.Smo.Scripter') ($s) 
$dbs = $s.Databases 
$fa = $dbs["FinancialAid"] 

$scrp.Options.ScriptData = $True 
$scrp.Options.AllowSystemObjects = $False 
$scrp.Options.FileName = 'StoredProcedures.sql' 
$scrp.Options.ToFileOnly = $True 

# Finally the stored procedures 

$sparray = to-array($fa.StoredProcedures) 
$scrp.EnumScript($sparray) 

這失敗,出現錯誤:

Exception calling "EnumScript" with "1" argument(s): "Script failed for Server 'LOCALHOST'. " 
At H:\Visual Studio 2012\FinancialAidApplication\Financial Aid Application\FinancialAidApplication\main\src\FinancialAidApp 
\SQL-Scripts\sp.ps1:28 char:17 
+ $scrp.EnumScript <<<< ($sparray) 
    + CategoryInfo   : NotSpecified: (:) [], MethodInvocationException 
    + FullyQualifiedErrorId : DotNetMethodException 

望着輸出文件,我看到它確實有我在開始的時候,這是偉大的存儲過程,但那麼它有一堆系統程序。最後一個是sys.sp_fulltext_table

正如我已經指定$scrp.Options.AllowSystemObjects = $False我不明白爲什麼這些系統程序被包括在內。我想擺脫系統過程和錯誤信息。

回答

1

或者你可以只跳過陣列完全,只是使用的管道。 (從某件東西,我經常使用,但修改您使用的變量)

add-type -AssemblyName "Microsoft.SqlServer.Smo, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" 
$s= new-object -TypeName Microsoft.SqlServer.Management.Smo.Server -ArgumentList 'LOCALHOST' 
$fa = $s.Databases['FinancialAid'] 
    $scrp = New-Object ("Microsoft.SqlServer.Management.Smo.Scripter") 
    $scrp.Server = $s 
    $options = New-Object ("Microsoft.SqlServer.Management.SMO.ScriptingOptions") 
    $options.IncludeHeaders = $true 
    $options.FileName = 'C:\temp\StoredProcedures.sql' 
    $options.AppendToFile = $true 
    $options.ToFileOnly = $true 
    $options.ScriptBatchTerminator = $true 
    $scrp.Options = $options 
$fa.StoredProcedures | foreach {if ($_.IsSystemObject -eq $false) { $scrp.Script($_) }} 
+0

一件事:我不得不使用'$ scrp.EnumScript'因爲'$ scrp.Script'拒絕腳本「數據」(我想它會考慮程序主體數據)。 –

+0

@SamuelEdwinWard,你是說你必須修改我的示例才能使其工作?如果是這樣,我很困惑。通過將服務器和數據庫名稱更改爲上面的代碼,在將其添加爲答案之前,它的工作沒有問題。 – Bruce

+0

你是對的,你有什麼應該工作。我已經將'ScriptData'設置爲true,我不應該擁有。在我早些時候掙扎的時候,這一定是我犯的一個錯誤。 –

1

幾件事情

  1. 試圖去實際的異常。將「內部異常powershell」投入到您最喜愛的搜索引擎中。現在,這只是一個通用的「出了點問題」,很難診斷(對你和我們來說都是這樣!)。

  2. 嘗試$sparray = to-array($fa.StoredProcedures | where {$_.IsSystemObject -eq $false)