2010-12-17 68 views
1

在SQL Server Management Studio中,可以選擇「生成腳本」。我們當前將2008 sql服務器數據庫傳輸到2005 sql server數據庫的方式是生成腳本並在該sql腳本文件上運行SQLCMD以推送到2005 sql server的本地實例。我創建了一個C#程序來完成其他一些任務,但我也需要它來轉換2008數據庫並將其移動到2005 sql服務器。是否有Transact sql語句或將2008數據庫轉換爲2005數據庫的更簡單方法?謝謝。生成等效於Transact SQL的腳本

+1

一個問題:爲什麼彈簧介意... – 2010-12-17 23:35:30

+0

及其對我國的傳統系統的支持。 – dangerisgo 2010-12-17 23:58:49

+0

如果你支持2005年,你爲什麼在2008年發展,這種方式是瘋狂的。遲早你會使用一些2005年無法識別的代碼,並發現當你移動prod是一個非常糟糕的時間。開發新版本比開發非常危險。 – HLGEM 2010-12-20 14:37:08

回答

4

您的開發交付物不應該是數據庫二進制文件(.MDF文件),而應該是部署腳本。你像對待任何其他源文件一樣對待你的數據庫部署和升級,將它置於源代碼控制之下,在檢入時有同行代碼評論等等。直接修改.MDF,然後進行逆向工程來部署它就是非常糟糕。您現在遇到的問題只是其中一個問題,還有更多問題,特別是在應用程序版本升級期間完成的問題模式更改。見Version Control and your Database

現在的確如此,整個VS工具集正在試圖引導您沿着'在VS數據庫瀏覽器中編輯您的MDF並且一切都會好的'路徑。沒有什麼會好起來的,一個或多個部署崩潰在你的生活中遙遙領先,但讓我們假裝VS會做一件好事。

您可以通過第三方商業工具(如Red Gate的SQL Compare)自動提取當前模式並對其進行部署,或者您可以非常容易地自行生成「生成腳本」。 SSMS所做的就是調用SMO腳本功能來編寫整個數據庫。你可以這樣做:實例化一個對象實例,然後添加你想要腳本的對象,然後提取T-SQL生成的腳本。那就是究竟是 SSMS中的'生成腳本'是什麼。沒有爲scripting在MSDN的例子:

//Connect to the local, default instance of SQL Server. 
    Server srv = new Server(); 

    //Reference the AdventureWorks2008R2 database. 
    Database db = srv.Databases["AdventureWorks2008R2"]; 

    //Define a Scripter object and set the required scripting options. 
    Scripter scrp = new Scripter(srv); 
    scrp.Options.ScriptDrops = false; 
    scrp.Options.WithDependencies = true; 

    //Iterate through the tables in database and script each one. Display the script. 
    //Note that the StringCollection type needs the System.Collections.Specialized namespace to be included. 
    Microsoft.SqlServer.Management.Sdk.Sfc.Urn[] smoObjects = new Microsoft.SqlServer.Management.Sdk.Sfc.Urn[1] ; 
    foreach (Table tb in db.Tables) { 
     smoObjects[0] = tb.Urn; 
     if (tb.IsSystemObject == false) { 
     System.Collections.Specialized.StringCollection sc; 
     sc = scrp.Script(smoObjects); 
     foreach (string st in sc) { 
      Console.WriteLine(st); 
     } 
     } 
    } 
+0

Remus,謝謝你的回覆。你的回覆使我更多地搜索了我以前不知道的課程。我遇到了Transfer類,它完全按照我希望的方式進行操作(有了它,我不必寫一個sql腳本並調用SQLCMD!),但它不會執行一件我需要的操作:它不會執行任何操作: t複製所有的約束(只是數據)。所以所有的FK,PK和IX都不見了。你知道我會如何轉移這些嗎?我找不到讓這些人轉移的選項?謝謝! – dangerisgo 2010-12-18 20:56:36

+0

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/b5219a28-64c2-462b-a263-66ae9cc9c45c/這也有幫助。謝啦! – dangerisgo 2010-12-18 21:45:56

0

從一個數據庫導入在其他

+0

我不完全確定你的意思。 – dangerisgo 2010-12-18 00:01:29

+0

轉到2005 Server Management Studio控制檯,右鍵單擊您的Db並選擇任務>導入數據。從SQL 2008 Server導入數據並按照嚮導進行操作。保存包。那就是你的代碼。運行也爲填充 – renegm 2010-12-18 00:45:21

+0

2005年SQL服務器是一個Express版本和2008年sql服務器是完整版本,但我不能保存該軟件包。我甚至做過2008年 - > 2008年,但仍然無法保存包裹。 – dangerisgo 2010-12-18 00:54:10

0

腳本編寫數據庫對象出來,然後上了年紀的實例中運行它們是要走的路。如果您編碼了SQL 2008的特定功能,那麼在2005年運行腳本時,您會發現它很正確(在使用Production之前進行測試!)。

設置兼容模式將不是幫助這裏。如果我有一個(2008)聲明的表類型,並將其與存儲過程參數一起使用,那麼SQL或其他任何人都可以將其遷移到2005年。使用「現代」系統來支持舊版系統最多也不過分。

只是因爲我做一遍,我的首選遷移路徑是:

  • 有發展,‘分期’和生產環境,都在2005年
  • 升級升級到2008
  • 繼續在dev/2005上進行開發,並將更改推向舞臺(2008)和製作(2005)。當它在2008年運行時(幾乎肯定會),管理層將滿足於升級生產。而你的2005年版本仍將在2005年的產品上運行。
  • 升級生產。嘿,它工作在升級,所以
  • 而從產生的一切(2005)開發適用於(2008年)分期和生產
  • 才把你升級發展,並與您的新玩具
  • 發揮它的安全和穩健
+0

這與我們所做的相似。一切從2005年開始。然後開發到2008年,生產停留在2005年。一旦我們的數據庫已經足夠完善並準備就緒,產量將延續到2008年。問題是我們必須支持將會有2005年的遺留系統,所以我們可以不會打破這些。我每次生產版本都會生成腳本,並且效果很好。問題是我正在編寫這個自動化程序,所以沒有管理工作室的交互,這樣任何人都可以運行它並從2008服務器上獲取2005 bak文件。 – dangerisgo 2010-12-18 00:25:56