86

我想在SQL Server Management Studio 2008中如何自動化SQL Server Management Studio 2008中的「生成腳本」任務?

現在我做什麼來自動生成腳本是:

  • 右鍵單擊我的數據庫,任務,「生成腳本...」
  • 手動選擇我需要的所有導出選項,並點擊選擇所有的「選擇對象」選項卡
  • 在選擇導出文件夾
  • 最後點擊「完成」按鈕

有沒有辦法讓這個任務自動化?

編輯:我想生成創建腳本,而不是更改腳本。

+0

您是否找到答案?我也想這樣做,我用Publishing,它很難保存,不知道在哪裏,哪裏沒有生成腳本時的所有選項: - ? – 2012-07-12 12:37:48

+1

正如在幾個答案中提到的那樣,如果您是開發人員,請使用SMO – 2014-04-16 21:53:07

回答

31

從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

http://scriptio.codeplex.com/

編輯:我用展鵬的SQL比較產品來做到這一點,因爲開始。這是一個很好的替代所有的SQL發佈嚮導應該。您選擇數據庫,備份或快照作爲源,並選擇一個文件夾作爲輸出位置,並將所有內容都轉儲到文件夾結構中。它恰好與他們的其他產品SQL Source Control使用的格式相同。

+0

2012年有沒有相當於?如果嚮導記住我的設置(如「腳本索引」),我會很高興。 – PeterX 2014-03-06 07:06:02

+6

@PeterX SMSS>工具>選項> SQL Server對象瀏覽器>腳本 – zanlok 2015-08-20 15:48:10

4

在工具>選項>設計人員>表格和數據庫設計人員中,有一個「自動生成更改腳本」選項,可以在您保存時爲每次更改生成一個選項。

+2

這不完全是我需要的。我想獲取創建腳本(我的最終目標是自動將這些文件簽入我的源代碼管理系統) – Brann 2009-01-27 14:33:13

3

您可以使用INFORMATION_SCHEMA表使用T-SQL代碼執行此操作。

還有第三方工具 - 我喜歡Apex SQL腳本,正是爲了您正在談論的使用。我從命令行完全運行它。

2

如果你想微軟解決方案,你可以嘗試:Microsoft SQL Server數據庫發佈嚮導1.1

http://www.microsoft.com/downloads/details.aspx?FamilyId=56E5B1C5-BF17-42E0-A410-371A838E570A&displaylang=en

它創建一個批處理過程中,你可以隨時隨地運行您需要重建的腳本。

+1

不幸的是,它不支持SqlServer 2008 – Brann 2009-01-27 15:02:55

+1

版本1.2說它支持2000和2005,但我只是用它在2008年使用3800多個表格編寫數據庫腳本,並且工作正常。它沒有包括壓縮選項,直到2008年才推出。我也剛剛測試了2008 R2數據庫,它的腳本也很好。 – Jeremy 2014-10-31 23:04:40

7

如果你是一名開發人員,一定要去SMO。這裏有一個鏈接到的編劇類,這是你的出發點:

Scripter Class

0

在Visual Studio 2008 SP1 TeamSuite:

在服務器資源管理器/數據連接選項卡上,有一個發佈到供應商的工具,與「Microsoft SQL Server數據庫發佈嚮導」相同,但與MS Sql Server 2008兼容。

+0

它如何幫助自動執行任務? – 2010-09-11 15:28:57

7

我沒有看到任何這些答案中提到的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使用簡單的現有工具(如數據庫發佈嚮導)的高度和可維護性。

2

我一直在使用DB的Comparer - 它的自由,沒有什麼大驚小怪的腳本整個數據庫,可以比較不同的數據庫,也產生差異的腳本。非常適合開發生產更改腳本。 http://www.dbcomparer.com/

35

與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(); 
13

我寫了一個名爲SchemaZen一個開源的命令行工具,做到這一點。它比來自management studio的腳本要快得多,它的輸出對版本控制更友好。它支持模式和數據的腳本。

若要生成腳本運行:

schemazen.exe script --server localhost --database db --scriptDir c:\somedir

然後重新創建數據庫從腳本運行:

schemazen.exe create --server localhost --database db --scriptDir c:\somedir
0

我正在使用VS 2012(對於MSSQL Server 2008上的DB)比較數據庫有一個選項來保存它,比較和選項。這基本上是你的交付設置。之後,你可以做更新或生成腳本。

我只是覺得有點尷尬,稍後從文件加載它(拖放從Windows資源管理器),因爲我沒有在解決方案資源管理器中看到該文件。

相關問題