﻿# 如何利用「資料庫發行精靈」將新版 SQL 資料庫降級成舊版

不知道各位有沒有遇過一種狀況，那就是原本 SQL Server 2005 的資料庫，將資料庫卸離 (Detach) 後丟進新版的 SQL Server 版本掛載 ( 例如 SQL 2008 或 SQL 2008 R2 )，然後突然間有同事說他的資料庫是舊版的，而你怎樣都再也無法將資料庫卸離後掛載到舊版的 SQL Server 了？！這問題似乎不是很多人知道怎樣處理，今天特別撰文說明整個轉移資料庫的流程，而且此功能已經內建於 Visual Studio 2010 之中，使用上非常方便，只是若沒人提起這功能，自己要找到這功能還真有點困難。^^

**資料庫發行精靈** (Database Publishing Wizard) 其實從 Visual Studio 2005 的時候就有了，只是當時並沒有內建於 Visual Studio 2005 之中，當時的版本為 [SQL Server Database Publishing Wizard 1.1](https://web.archive.org/web/20130219022518/http://www.microsoft.com/en-us/download/details.aspx?id=5498) 需額外下載才能使用。

之後到了 Visual Studio 2008 便內建在開發工具裡，而且不再另外提供下載連結，這時的版本為 SQL Server Database Publishing Wizard 1.2 版，其工具所在目錄為 C:\\Program Files (x86)\\Microsoft SQL Server\\90\\Tools\\Publishing\\1.2\\SqlPubWiz.exe 

接著到了 Visual Studio 2008 SP1 又推出了更新版為 SQL Server Database Publishing Wizard 1.3 版，不過該工具由於是直接從 Visual Studio 2008 升級上去的關係，所以此版本的安裝路徑還是跟之前的 1.2 版一樣，在 C:\\Program Files (x86)\\Microsoft SQL Server\\90\\Tools\\Publishing\\1.2 目錄裡，關於版本號可以從控制台的新增與移除程式理看得到：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/d936429e0793a2cdccbe-image_814.png)

如果你沒有安裝 Visual Studio 2008 卻又想要安裝 SQL Server Database Publishing Wizard 1.3 版的話，微軟是有提供下載連結的：http://go.microsoft.com/fwlink/?LinkId=119368

目前的最新版為 SQL Server Database Publishing Wizard 1.4 版，並內建於 Visual Studio 2010 之中 ( 註: 我找不到有可獨立下載的地方 )，其安裝好之後的程式所在路徑為 C:\\Program Files (x86)\\Microsoft SQL Server\\90\\Tools\\Publishing\\1.4\\SqlPubWiz.exe

編按：這資料庫發行精靈的歷史我研究了好久，說真的我也不知道我研究這歷史要幹嘛，就是覺得要介紹這工具不知道有點怪，然後花了些時間研究，不寫出來還不太甘心，哈～ XD

講述完資料庫發行精靈的歷史之後，接下來就開始講解使用的方法，這個**資料庫發行精靈**雖然是個 **精靈** (Wizard)，可以透過 Visual Studio 2010 啟動或直接執行 **SqlPubWiz.exe** 啟動該程式，並透過視窗介面一步步操作即可完成，使用上並不複雜，但此工具同時還能當成指令列工具才操作，可透過批次檔自動化一些資料庫發行的相關自動化作業。

以下我用三種情境跟各位說明如何使用此工具：

1\. 透過 **SqlPubWiz.exe** 程式啟動

前段文章的說明之中有提到 **SqlPubWiz.exe** 程式的所在路徑為 C:\\Program Files (x86)\\Microsoft SQL Server\\90\\Tools\\Publishing\\1.4\\ 目錄，因此可以透過檔案總管進入該目錄後直接用滑鼠雙擊 **SqlPubWiz.exe** 來啟動程式。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/1cccb8741898262ac1b6-image_815.png)

點開後第一步是先指定來源伺服器的連線資訊，你可以透過連接字串或直接指定伺服器資訊進行連結：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/0282cd3fcc695ed2dda3-SNAGHTML3187c9b8.png)

第二步為選取該伺服器中的資料庫，並且要勾選「**為選取資料庫中的所有物件編寫指令碼**」，此選項預設為勾選。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4f2cce8e6bc6e5b4e4d4-SNAGHTML3188edfa.png)

第三步為指定編寫後的指令要儲存在哪個檔案，需指定完整檔案路徑：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7fdc399f310dddfb3327-SNAGHTML31948e3f_4.png)

第四步非常重要，由於我們的目的是為了要將資料庫降級，例如將 SQL Server 2008 R2 的資料庫降級到 SQL Server 2005，這時你就必須選取四當的目標資料庫版本，透過**資料庫發行精靈**就會幫你產生適當的 T-SQL 指令碼方便你建立適當的資料庫。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/acd2717567f935e94092-image_816.png)

第四步除此之外還有的重點，那就是可以設定**要發行的資料類型**，預設選取為「結構描述和資料」，也代表著最後產生出來的指令碼不僅僅是資料庫中的物件編碼(DDL)而已，還包含改資料庫中完整的資料，並且以 INSERT INTO 的方式，完全用 T-SQL 來表示資料的內容。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/520059fe78fc749d6ea3-SNAGHTML318f6165.png)

最後確認一下設定資料後按下完成，**資料庫發行精靈**就會立即產生指令碼

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/c357ae6ed615c0d9c15a-SNAGHTML319349ef.png)

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7643d5310772c7c7bf3a-SNAGHTML319524b3.png)

最後，你只要拿著這份 T-SQL 指令檔 ( 以上圖的例子就是 G:\\Temp\\AdventureWorksLT.sql 這個檔案 ) 到目的資料庫 ( SQL 2005 ) 執行，就可以建立一個完全相同規格且完全相同資料的資料庫起來了！

2\. 透過 **Visual Studio 2010** 啟動

如下圖示，先開啟**伺服器總管**視窗，你在資料連接裡應該已經建立好一些常用的資料庫連線，你可以在任意一個資料連接的項目上按下滑鼠右鍵選取 **Publish to provider** 項目：

![image](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/644008b13bf5609eea9e-image_817.png "image")

由於在資料連接裡已經包含了連線參數，因此**資料庫發行精靈**啟動後會省去第一個連接資料庫的步驟，直接連接到該伺服器，並讓你選取資料庫：

![](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/4f2cce8e6bc6e5b4e4d4-SNAGHTML3188edfa.png)

剩下的步驟就一模一樣了，因此不再贅述。

3\. 在**命令提示字元**下使用 **SqlPubWiz.exe** 程式

先開啟命令提示字元視窗，並 CD 進入 C:\\Program Files (x86)\\Microsoft SQL Server\\90\\Tools\\Publishing\\1.4 目錄。

我們可以先輸入 SqlPubWiz.exe help script 查詢使用方法：

**使用方式:**

sqlpubwiz script ( -C connection\_string | -d local\_database\_name ) (output\_file) \[參數\]

**參數:**

輸出選項:

  \[-f\] :                       覆寫現有檔案  
  \[-noschemaqualify\] :         輸出指令碼未以結構描述名稱限定物件名稱。  
  \[-schemaonly\] :              僅編寫結構描述的指令碼  
  \[-dataonly\] :                僅編寫資料的指令碼  
  \[-targetserver\] :            指定指令碼應以何種版本的 SQL Server 為目標。  
                               有效的版本為 "2000" 和 "2005"。 預設值: 2005  
  \[-q\] :                       隱藏輸出  
  \[-nodropexisting\] :           預設值: False

本機連接相關:

  \[-C connection\_string\] :     連接字串  
  \[-d local\_database\_name\] :   要編寫指令碼的資料庫名稱  
  \[-U local\_user\_name\] :       使用者名稱  
  \[-P local\_password\] :        密碼  
  \[-S local\_server\_name\] :     伺服器名稱

以下是幾個常用的指令範例：

‧連接到 **(local)\\SQLEXPRESS** 伺服器，將 **AdventureWorksLT** 資料庫編碼後輸出 (用 Windows 驗證)

```
SqlPubWiz.exe script -S (local)\SQLEXPRESS -d AdventureWorksLT G:\Temp\AdventureWorksLT.sql
```

‧連接到 **(local)\\SQLEXPRESS** 伺服器並指定帳號密碼，將 **AdventureWorksLT** 資料庫編碼後輸出

```
SqlPubWiz.exe script -S (local)\SQLEXPRESS –U sa –P xxxxx -d AdventureWorksLT G:\Temp\db1.sql
```

**相關連結**

-   [使用資料庫發行精靈部署資料庫 (Visual Studio)](http://msdn.microsoft.com/zh-tw/library/bb907585.aspx)
-   [使用複製資料庫精靈 (SQL Server 2008 R2)](http://msdn.microsoft.com/zh-tw/library/ms188664.aspx)
-   [德瑞克：SQL Server 學習筆記 使用「資料庫發行精靈」](http://sharedderrick.blogspot.com/2009/02/visual-studio-2008sql-server-2008sql_27.html)
-   [下載詳細資料： SQL Server Database Publishing Wizard 1.1](https://web.archive.org/web/20130219022518/http://www.microsoft.com/en-us/download/details.aspx?id=5498)
-   [Download details: Microsoft SQL Server Database Publishing Services 1.1](http://web.archive.org/web/20111109080325/http://www.microsoft.com/download/en/details.aspx?id=432)
-   [Using the Copy Database Wizard](http://msdn.microsoft.com/en-us/library/ms188664.aspx)
-   [SQL Database Publishing wizard is now in Visual Studio 2008. - Visual Web Developer Team](https://devblogs.microsoft.com/dotnet/sql-database-publishing-wizard-is-now-in-visual-studio-2008/)
-   [SQL Database Publishing wizard with SQL Server 2008 - Stack Overflow](http://stackoverflow.com/questions/1391013/sql-database-publishing-wizard-with-sql-server-2008)
-   [Database Publishing Wizard in VS 2010 Professional](http://social.msdn.microsoft.com/Forums/en/vssetup/thread/42bbad47-5b6e-4e99-8d27-07bcbd123064) (Visual Studio Forums)
-   [使用產生和發佈指令碼精靈 (SQL Server 2008 R2)](http://msdn.microsoft.com/zh-tw/library/bb895179.aspx)
-   [使用發行資料庫精靈 (SQL Server 2008)](http://msdn.microsoft.com/zh-tw/library/bb895179\(v=sql.100\).aspx)
-   [SQL Server Hosting Web Service (and toolkit)](http://www.codeplex.com/wikipage?ProjectName=sqlhost)
-   [SQL Server Hosting Web Service (and toolkit) - Database Publishing Wizard](https://learn.microsoft.com/en-us/ssms/scripting/generate-and-publish-scripts-wizard)
-   [SQL Server Hosting Web Service (and toolkit) - Database Publishing Services](https://web.archive.org/web/20171225010026/http://sqlhost.codeplex.com/wikipage?title=Database%20Publishing%20Services&referringTitle=Home)
