我本人是做C# winform 開發的。
最近接觸一個任務。要根據SQL裡一個現有的表產生建立這個表的指令碼。
先是想從預存程序的角度解決問題
在網上看了一些資料,發現MSSQL本身沒有這個功能,要自己去寫。
而其他的資料庫物件(視圖,預存程序,觸發器)則可以通過 SPHelp_Text來解決。
查一些資料無果後,決定自己研究一下。
看了一下SQL的聯機文檔 ,發現有SMO開發的方式。
如果要產生指令碼,需要的引用 為
C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.ConnectionInfo.dll
C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Management.Sdk.Sfc.dll
C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.Smo.dll
C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.SmoExtended.dll
C:\Program Files (x86)\Microsoft SQL Server\100\SDK\Assemblies\Microsoft.SqlServer.SqlEnum.dll
下面做一個拋磚引玉,貼一下產生指令碼的源碼
代碼
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using System.Collections.Specialized;
namespace geyunfei
{
class Program
{
static void Main(string[] args)
{
//初始化一個串連
Server server = new Server(new ServerConnection(
"localhost", "sa", ""));
//得到資料庫
var srcDb = server.Databases["TestDB"];
//得到表
Table table = srcDb.Tables["Table1"];
//初始化Scripter
Scripter a = new Scripter();
a.Options.Add(ScriptOption.DriAllConstraints);
a.Options.Add(ScriptOption.DriAllKeys);
a.Options.Add(ScriptOption.Default);
a.Options.Add(ScriptOption.ContinueScriptingOnError);
a.Options.Add(ScriptOption.ConvertUserDefinedDataTypesToBaseType);
a.Options.Add(ScriptOption.IncludeIfNotExists);
UrnCollection collection = new UrnCollection();
collection.Add(table.Urn);
var sqls = a.Script(collection);
foreach (var s in sqls)
{
System.Console.WriteLine(s);
}
}
}
}
附一些沒用的話:
怎麼找到使用SMO這個方式的。。。
1.接到任務,第一反應,預存程序。在網上查了一堆資料,發現都是程式員自己寫的,MS沒有提供類似於Sphelp_text的方法,雖然也可以用,但是大多針對 特定版本的資料庫,不好維護。
2.轉而準備使用反應,用SQL TO Linq的檔案產生指令碼,但是,仍然上個原因,不好維護這個東西。
3.想起來Sqlserver mangement studio裡可以產生指令碼 。於是自己翻SSMS的動態 串連庫,根據 名稱試了幾個DLL的名稱,太複雜 ,沒有搞定。
4.於是開始查SQL的聯機文檔,發現有這個功能,試了一下,還真好用,嘿嘿。