我想在SQL Server Management Studio 2008中如何自動化SQL Server Management Studio 2008中的「生成腳本」任務?
現在我做什麼來自動生成腳本是:
- 右鍵單擊我的數據庫,任務,「生成腳本...」
- 手動選擇我需要的所有導出選項,並點擊選擇所有的「選擇對象」選項卡
- 在選擇導出文件夾
- 最後點擊「完成」按鈕
有沒有辦法讓這個任務自動化?
編輯:我想生成創建腳本,而不是更改腳本。
我想在SQL Server Management Studio 2008中如何自動化SQL Server Management Studio 2008中的「生成腳本」任務?
現在我做什麼來自動生成腳本是:
有沒有辦法讓這個任務自動化?
編輯:我想生成創建腳本,而不是更改腳本。
從Visual Studio 2008 SP1團隊套件中提及的Brann是數據庫發佈嚮導的1.4版。它與sql server 2008(可能只有專業?)一起安裝到\ Program Files \ Microsoft SQL Server \ 90 \ Tools \ Publishing \ 1.4。來自服務器瀏覽器的VS調用只是簡單地調用它。您可以通過像在命令行中實現相同的功能:
sqlpubwiz help script
我不知道是否V1.4具有V1.1做(用戶轉換爲角色相同的煩惱,在不創建的約束但它不是我的解決方案,因爲它不會將對象編寫到不同的文件,如SSMS中的任務 - >生成腳本選項。我目前使用修改後的Scriptio版本(使用MS SMO API)作爲數據庫發佈嚮導(sqlpubwiz.exe)的改進替代品。目前它還沒有從命令行編寫腳本,我可能會在未來添加該貢獻。
Scriptio最初是在Bill Graziano的博客上發佈的,但隨後由Bill發佈到CodePlex並由其他人更新。閱讀討論,看看如何編譯使用與SQL Server 2008
編輯:我用展鵬的SQL比較產品來做到這一點,因爲開始。這是一個很好的替代所有的SQL發佈嚮導應該。您選擇數據庫,備份或快照作爲源,並選擇一個文件夾作爲輸出位置,並將所有內容都轉儲到文件夾結構中。它恰好與他們的其他產品SQL Source Control使用的格式相同。
在工具>選項>設計人員>表格和數據庫設計人員中,有一個「自動生成更改腳本」選項,可以在您保存時爲每次更改生成一個選項。
這不完全是我需要的。我想獲取創建腳本(我的最終目標是自動將這些文件簽入我的源代碼管理系統) – Brann 2009-01-27 14:33:13
您可以使用INFORMATION_SCHEMA表使用T-SQL代碼執行此操作。
還有第三方工具 - 我喜歡Apex SQL腳本,正是爲了您正在談論的使用。我從命令行完全運行它。
您可以使用SQL Server管理對象(SMO)自動化SQL Server 2005管理任務,包括生成腳本:http://msdn.microsoft.com/en-us/library/ms162169.aspx。
如果你想微軟解決方案,你可以嘗試:Microsoft SQL Server數據庫發佈嚮導1.1
它創建一個批處理過程中,你可以隨時隨地運行您需要重建的腳本。
如果你是一名開發人員,一定要去SMO。這裏有一個鏈接到的編劇類,這是你的出發點:
在Visual Studio 2008 SP1 TeamSuite:
在服務器資源管理器/數據連接選項卡上,有一個發佈到供應商的工具,與「Microsoft SQL Server數據庫發佈嚮導」相同,但與MS Sql Server 2008兼容。
它如何幫助自動執行任務? – 2010-09-11 15:28:57
我沒有看到任何這些答案中提到的SQLPSX powershell ...我個人沒有玩過它,但它看起來非常簡單易用,非常適合這種類型的自動化任務,其任務如下:
Get-SqlDatabase -dbname test -sqlserver server | Get-SqlTable | Get-SqlScripter | Set-Content -Path C:\script.sql
Get-SqlDatabase -dbname test -sqlserver server | Get-SqlStoredProcedure | Get-SqlScripter
Get-SqlDatabase -dbname test -sqlserver server | Get-SqlView | Get-SqlScripter
(參照http://www.sqlservercentral.com/Forums/Topic1167710-1550-1.aspx#bm1168100)
項目頁面:http://sqlpsx.codeplex.com/
這種方法的主要優點是,它結合使用直接SMO的configurablity /定製,與CONV使用簡單的現有工具(如數據庫發佈嚮導)的高度和可維護性。
我一直在使用DB的Comparer - 它的自由,沒有什麼大驚小怪的腳本整個數據庫,可以比較不同的數據庫,也產生差異的腳本。非常適合開發生產更改腳本。 http://www.dbcomparer.com/
與SSMS中的腳本生成相比,SqlPubwiz的選項非常有限。相比之下,SMO的選項與SSMS中的選項幾乎完全一致,表明它可能甚至是相同的代碼。 (我希望MS不會寫兩遍!)在MSDN上有幾個例子,如this one,它們將腳本表顯示爲單獨的對象。但是,如果您希望所有腳本都使用包含'DRI'(聲明式參照完整性)對象(如外鍵)的'完整'模式正確編寫腳本,則單獨編寫腳本表不會正確執行依賴關係。我發現收集所有的URN並將它們作爲一個數組傳遞給scripter是必要的。此代碼,從示例修改,對我的作品(雖然我敢說,你可以整理一下和評論多一點):
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Sdk.Sfc;
...
// Connect to the local, default instance of SQL Server.
Server srv = new Server();
// Reference the database.
Database db = srv.Databases["YOURDBHERE"];
Scripter scrp = new Scripter(srv);
scrp.Options.ScriptDrops = false;
scrp.Options.WithDependencies = true;
scrp.Options.Indexes = true; // To include indexes
scrp.Options.DriAllConstraints = true; // to include referential constraints in the script
scrp.Options.Triggers = true;
scrp.Options.FullTextIndexes = true;
scrp.Options.NoCollation = false;
scrp.Options.Bindings = true;
scrp.Options.IncludeIfNotExists = false;
scrp.Options.ScriptBatchTerminator = true;
scrp.Options.ExtendedProperties = true;
scrp.PrefetchObjects = true; // some sources suggest this may speed things up
var urns = new List<Urn>();
// Iterate through the tables in database and script each one
foreach (Table tb in db.Tables)
{
// check if the table is not a system table
if (tb.IsSystemObject == false)
{
urns.Add(tb.Urn);
}
}
// Iterate through the views in database and script each one. Display the script.
foreach (View view in db.Views)
{
// check if the view is not a system object
if (view.IsSystemObject == false)
{
urns.Add(view.Urn);
}
}
// Iterate through the stored procedures in database and script each one. Display the script.
foreach (StoredProcedure sp in db.StoredProcedures)
{
// check if the procedure is not a system object
if (sp.IsSystemObject == false)
{
urns.Add(sp.Urn);
}
}
StringBuilder builder = new StringBuilder();
System.Collections.Specialized.StringCollection sc = scrp.Script(urns.ToArray());
foreach (string st in sc)
{
// It seems each string is a sensible batch, and putting GO after it makes it work in tools like SSMS.
// Wrapping each string in an 'exec' statement would work better if using SqlCommand to run the script.
builder.AppendLine(st);
builder.AppendLine("GO");
}
return builder.ToString();
我寫了一個名爲SchemaZen一個開源的命令行工具,做到這一點。它比來自management studio的腳本要快得多,它的輸出對版本控制更友好。它支持模式和數據的腳本。
若要生成腳本運行:
schemazen.exe script --server localhost --database db --scriptDir c:\somedir
然後重新創建數據庫從腳本運行:
schemazen.exe create --server localhost --database db --scriptDir c:\somedir
也有這個簡單的命令行工具,我建立我的需要。
http://mycodepad.wordpress.com/2013/11/18/export-ms-sql-database-schema-with-c/
它可以導出整個數據庫,並嘗試導出加密對象。一切都存儲在文件夾和單獨的SQL文件,以便於文件比較。
代碼也可以在github上找到。
我正在使用VS 2012(對於MSSQL Server 2008上的DB)比較數據庫有一個選項來保存它,比較和選項。這基本上是你的交付設置。之後,你可以做更新或生成腳本。
我只是覺得有點尷尬,稍後從文件加載它(拖放從Windows資源管理器),因爲我沒有在解決方案資源管理器中看到該文件。
您是否找到答案?我也想這樣做,我用Publishing,它很難保存,不知道在哪裏,哪裏沒有生成腳本時的所有選項: - ? – 2012-07-12 12:37:48
正如在幾個答案中提到的那樣,如果您是開發人員,請使用SMO – 2014-04-16 21:53:07