使用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Sql scriptsSQL
- 用 WebSphere CloudBurst 實現定製: 使用指令碼包定製超級模式WebCloud指令碼模式
- 使用 Dockerfile 定製映象【轉】Docker
- oracle9i SQL ScriptsOracleSQL
- sql實現行轉列SQL
- 如何在定製化元件中實現並使用v-model元件
- 定製login.sqlSQL
- 定製SQL*Plus環境SQL
- mybatis實現變數定義,實現sql業務程式碼MyBatis變數SQL
- SQL中也可以用格式字串定製日期轉字串SQL字串
- npm scripts 使用指南NPM
- 使用elasticsearch,Elasticsearch Scripts disabledElasticsearch
- 定製化根佈局(Kotlin實現)Kotlin
- 實現B/S環境的UI定製UI
- c#實現用SQL池(多執行緒),定時批量執行SQL語句 (轉)C#SQL執行緒
- sql 實現表的行列轉換SQL
- sql行列轉置的實現方法SQL
- SQL Server中也用格式字串定製日期轉換為字串SQLServer字串
- Airbnb定製Superset實現更好BI商業智慧AI
- 定製sql*plus的幾條命令SQL
- ERP幫助製造業實現高效製造(轉)
- npm scripts設定環境變數方法NPM變數
- 轉~timesten系列六:定義複製,實現timesten的高可用性
- 使用 Dockerfile 定製映象Docker
- 使用Dockerfile定製映象Docker
- 使用SQL實現特殊查詢(1)SQL
- C++模板的定製二:定製C++類 (轉)C++
- C++模板的定製一:定製函式模板 (轉)C++函式
- 使用Quartz實現定時作業quartz
- 5.npm scripts 使用指南NPM
- Oracle Advanced Performance Tuning Scripts(轉)OracleORM
- 學習 Shell Scripts(轉載鳥哥)
- Gradle 實現 Android 多渠道定製化打包GradleAndroid
- C++模板的定製三:部分定製C++類 (轉)C++
- SQL 如何實現動態的行列轉置SQL
- SQL Server 實現行列(縱橫表)轉換SQLServer
- VB實現SQL Enterprise Manager功能 (轉)SQL
- 【轉】【SQL】 實現左單一匹配SQL