我想寫一個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
我不明白爲什麼這些系統程序被包括在內。我想擺脫系統過程和錯誤信息。
一件事:我不得不使用'$ scrp.EnumScript'因爲'$ scrp.Script'拒絕腳本「數據」(我想它會考慮程序主體數據)。 –
@SamuelEdwinWard,你是說你必須修改我的示例才能使其工作?如果是這樣,我很困惑。通過將服務器和數據庫名稱更改爲上面的代碼,在將其添加爲答案之前,它的工作沒有問題。 – Bruce
你是對的,你有什麼應該工作。我已經將'ScriptData'設置爲true,我不應該擁有。在我早些時候掙扎的時候,這一定是我犯的一個錯誤。 –