使用SQL-DMO實現定製SQL Scripts (轉)
我是個負責應用的開發人員,昨夜和舊同事電話中談到了一個
大家共同的苦惱:因為幾乎每天都要將自己的資料庫專案生成 Scripts
以供存檔或發給客戶,所以生成SQL Scripts就成了每天的必修課。
而SQLSERVER的企業管理器又無法支援將生成SQL Scripts的過程儲存為一個設定
,每次都必須做許多相同的工作,
如:選擇呀、設定格式呀、表指令碼選項、檔案選項。。老是重複這樣的操作
實在太麻煩了!電話閒聊完後就想:能不能寫個,在可以提供SQLSERVER
企業管理器所支援所有功能外,再增加個支援將各個選項的設定儲存為
檔案(如:ini或XM格式)的功能呢?這樣我以後只要選取不同的配置檔案就可以
直接生成出自己需要的Scripts格式,那樣多好呀。。。
但如何實現Scripts的生成呢?就考慮使用下以前很少用的SQL-DMO吧!
心動不如行動,雖然夜已深,但有新鮮的體驗總讓我精神抖擻。。。呵呵,好了
不廢話了。。就先簡單地談談如何使用SQL-DMO來實現自己的需求吧~~~~
(程式碼示例使用Pascal語言表述)
1. 列舉內所有的SQLSERVER例項
:
function GetAllServerInstances :TStringList;
var
oApplication ,
oSeverNameList : Variant ;
i : integer ;
sNameList : TStringList ;
begin
sNameList := TStringList.Create ;
oApplication := CreateOLE ('SQLDMO.Application') ;
oSeverNameList := oApplication.ListAvailableSQLServers ;
for i:= 1 to oSeverNameList.Count do
sNameList.Append (oSeverNameList.Item(i)) ;
Result := sNameList ;
oApplication := NULL;
oSeverNameList := NULL;
end;
2.登陸到指定的SQLSERVER例項
函式:
function LoginServerInstances (sServer,sUser,sPass :string):Variant;
var
oSQLServer : Variant ;
begin
oSQLServer := CreateOLEObject ('SQLDMO.SQLServer');
oSQLServer.LoginTimeout := 30;
oSQLServer.LoginSecure := False;
oSQLServer.AutoReconnect := True;
oSQLServer.Connect(sServer,sUser,sPassword);
Result := oSQLServer;
oSQLServer := NULL ;
end;
以上兩個函式可以幫助我們完成取得區域網內所有的SQLSERVER例項並且
登陸上一個指定的例項。接下來就看看如何取得指定資料庫的表名稱和
過程名稱 :
3.列舉指定Sqlserver例項所有database的名稱
函式:
function GetAllDatabaseNameList (oSQLServer : Variant ):TStringList;
var
sNameList : TStringList ;
i : integer;
begin
sNameList := TStringList.Create ;
for i:= 1 to oSQLServer.Databases.Count do
sNameList.Append (oSQLServer.Databases.Item(i).Name) ;
Result := sNameList ;
end;
4.列舉指定資料庫所有Table的名稱
函式:
function GetAllTableNameList (oSQLServer : Variant ; sDataBaseName : string ):TStringList;
var
oDatabase : Variant ;
sNameList : TStringList ;
i : integer;
begin
sNameList := TStringList.Create ;
oDatabase := CreateOLEObject ('SQLDMO.Database');
oDatabase := oSQLServer.Databases.Item(sDataBaseName);
for i:= 1 to oDatabase.Tables.Count do
sNameList.Append (oDatabase.Tables.Item(i).Name) ;
Result := sNameList ;
oDatabase := Null ;
end;
5.列舉指定資料庫所有StoreProcedure的名稱
函式:
function GetAllStoreProcedureNameList (oSQLServer : Variant ; sDataBaseName : string ):TStringList;
var
oDatabase : Variant ;
sNameList : TStringList ;
i : integer;
begin
sNameList := TStringList.Create ;
oDatabase := CreateOLEObject ('SQLDMO.Database');
oDatabase := oSQLServer.Databases.Item(sDataBaseName);
for i:= 1 to oDatabase.StoredProcedures.Count do
sNameList.Append (oDatabase.StoredProcedures.Item(i).Name) ;
Result := sNameList ;
oDatabase := Null ;
end;
透過以上3個函式就可以把生成Scripts前的準備工作做好了,然後就可以開始
著重瞭解如何生成Scripts了。Scripts也同樣是SQL-DMO某些物件的Method。這些
物件如:Database,View ,StoredProcedure ,Trigger ,Check 等等。
Scripts Method 的Syntax是:
object.Script( [ ScriptType ] [, ScriptFilePath ] [, Script2Type ] ) as String
ScriptType (integer type) 引數是來設定產生什麼內容的Scripts ,如對其賦值SQLDMOScript_Default,
這樣就產生的是 該物件普通的指令碼,如StoredProcedure object,那肯定就是
其create StoredProcedure 的內容咯。如果賦值SQLDMOScript_Drops的話,
那就產生的是drop object的內容。關於ScriptType,Script2Type (integer type)
這個引數的詳細使用可以 參閱 : C:Program Files 80ToolsBookssqldmo.chm
的幫助檔案。Script方法的返回值是文字型別,不管你填不填ScriptFilePath引數,
你都能得到該文字,也就是Script 的內容。
而Table ,UserDefinedDatatype 這兩個物件生成Scripts的Method比較特殊,
它們的是GenerateSQL Method,其Syntax是:
object.GenerateSQL( Database ) as String ,比較簡單沒有過多的引數,返回值
也是Script 的內容。
建議:把ScriptType,Script2Type兩個引數可以賦予的值做成常量,這樣在
中呼叫更直觀些。如:SQLDMOScript_DatabasePessions = 32;
SQLDMOScript_Default = 4; ....
根據上面的說明可以建立這個函式(在申明此函式時填加overload表示同名不同參函式的過載):
成指定Objects的Sql Scripts
oSqlObjcet : Database,View ,StoredProcedure ,Trigger ,Check)
// sScriptFilePath defalut is ''
function GetThisObjectScripts (oSqlObjcet : Variant ;sScriptFilePath : string ;
iScriptType,iScript2Type : integer) : string ;
begin
Result := oSqlObjcet.Script(iScriptType,sScriptFilePath,iScript2Type) ;
end;
成指定Objects的Sql Scripts
// overload Method
oSqlObjcet : Table ,UserDefinedDatatype)
function TForm1.GetThisObjectScripts (oDatabase ,oSqlObjcet : Variant ) : string ;
begin
Result := oSqlObjcet.GenerateSQL(oDatabase) ;
end;
呼叫的時候可以根據介面選擇生成什麼樣格式的物件就傳入相應的引數
寫個簡單的例子,取出master的MS_sqlctrs_users的內容:
procedure TForm1.Button4Click(Sender: TObject);
var
oSQLServer,
oDatabase,
oStoredProcedure : Variant ;
ReturnStr : string;
begin
oDatabase := CreateOLEObject ('SQLDMO.Database');
oSQLServer := LoginServerInstances('DAVID','sa','');
oDatabase := oSQLServer.Databases.Item('master');
oStoredProcedure := oSQLServer.Databases.Item('master').StoredProcedures.Item('MS_sqlctrs_users');
成create procedure的Scripts,將第一個4換成1就成了drop procedure的 Scripts了
ReturnStr := GetThisObjectScripts(oStoredProcedure,'',4,4);
ShowMessage(ReturnStr);
end;
如果多個物件都需要匯出 Scripts 話,可以用個string 變數儲存被迴圈呼叫的
GetThisObjectScripts過程,就可以實現匯出多個物件的指令碼了!
關於儲存和取出配置生成Scripts的過程,我想不用詳細描述了吧?
只需把設定好的狀態儲存到配置檔案中,並且可以呼叫配置檔案
反向對控制元件狀態來設定,這樣就簡單的實現了自定義的過程呀。
呵呵,到這裡就進入尾聲了,透過組合上面這些函式,
並且設定合理的介面呼叫,這程式應該很容易完成吧~~~~
既然這樣,那讓我們為提供自己工作而建立更多小工具呀!
更多詳情,請參閱 :
C:Program FilesMicrosoft SQL Server80ToolsBookssqldmo.chm
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-962629/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用 Dockerfile 定製映象【轉】Docker
- Oracle Advanced Performance Tuning Scripts(轉)OracleORM
- 如何在定製化元件中實現並使用v-model元件
- mybatis實現變數定義,實現sql業務程式碼MyBatis變數SQL
- SQL 如何實現動態的行列轉置SQL
- 【轉】【SQL】 實現左單一匹配SQL
- 5.npm scripts 使用指南NPM
- SQL Azure使用Excel實現BI功能:PowerPivotTWSQLExcel
- Airbnb定製Superset實現更好BI商業智慧AI
- 使用 Dockerfile 定製映象Docker
- 使用Quartz實現定時作業quartz
- 使用 NSProxy 實現訊息轉發
- 使用python matplotlib實現動圖繪製Python
- Django實踐(二)——使用模型類定義資料表,實現表單頁面跳轉Django模型
- 實戰-使用 Cobbler 定製化安裝指定系統
- SQL Server2005使用CTE實現遞迴QCSQLServer遞迴
- NGINX使用rewrite實現http 跳轉 httpsNginxHTTP
- Ubuntu使用dd命令實現硬碟級複製Ubuntu硬碟
- RecyclerView定製:通用ItemDecoration及全展開RecyclerView的實現View
- 實現一個可定製化的FlowLayout -- 原理篇
- 採用React + Fabric + ImageMagick 實現大圖片DIY定製React
- AWR TOP SQL實現SQL
- 神奇的npm -- scriptsNPM
- 使用Java實現定時任務排程Java
- logrus的使用及格式定製
- [SQL Server玩轉Python] 二.T-SQL查詢表格值及Python實現資料分析SQLServerPython
- 【轉載】使用WindowManage實現Android懸浮窗Android
- 3、使用Windows命令來實現埠轉發Windows
- 使用Python 實現 PDF 到 HTML 的轉換PythonHTML
- Spring+quartz實現動態化定時任務 (轉)Springquartz
- java實現Excel定製匯出(基於POI的工具類)JavaExcel
- c# 實現定義一套中間SQL可以跨庫執行的SQL語句C#SQL
- Lumen 實現 SQL 監聽SQL
- 用pandas實現SQL功能SQL
- 關於IDEA使用xml實現動態sql的問題IdeaXMLSQL
- golang使用go-sql-driver實現mysql增刪改操作GolangMySql
- vscode commitlint(debug npm scripts)VSCodeMITNPM
- npm package.json scriptsNPMPackageJSON
- 【TUNE_ORACLE】定製化執行計劃SQL參考OracleSQL