作者:Andrew Clinick
發(fā)表日期:2000 年 1 月 10 日
我在 “If It Moves, Script It”(英文) 這篇文章中曾談到,如何使用“Windows Script Host(WSH)”( Windows 腳本主機(jī)) 管理 Windows 和 Windows 中的應(yīng)用程序。文中的大多數(shù)示例都是基于管理 Windows 操作系統(tǒng)自身的,并不基于在該操作系統(tǒng)下運(yùn)行的應(yīng)用程序。為迎接新千年,我想我應(yīng)該談?wù)劊绾卧诒姸囡@露可腳本化接口的應(yīng)用程序中使用腳本。這次只涉及“SQL Server”。在以后的幾個(gè)月中,我將著重談 Exchange、Office 和“系統(tǒng)管理服務(wù)器”。
您可以通過(guò)使用“分布式管理對(duì)象”、“數(shù)據(jù)轉(zhuǎn)換服務(wù)”和新的“SQL Server XML”實(shí)現(xiàn),將腳本用于“SQL Server”。
許多人都能夠通過(guò)“Active Data Object(ADO)”和“Active Server Page (ASP)”技術(shù)訪問(wèn)數(shù)據(jù)庫(kù)了。ADO 在幫助您查詢(xún)和更新數(shù)據(jù)庫(kù)方面做了大量的工作 — 但在備份(Y2K 問(wèn)題帶給我們的警惕)或是數(shù)據(jù)庫(kù)之間的傳輸數(shù)據(jù)方面,其表現(xiàn)又如何呢?而這時(shí)就非涉及到 XML 不可了。
在此,我將告訴您如何通過(guò)使用 ADO 的伴隨技術(shù) - 特別是“分布式管理對(duì)象”、“數(shù)據(jù)轉(zhuǎn)換服務(wù)”和新的“SQL Server XML”實(shí)現(xiàn),將腳本用于“SQL Server”。
分布式管理對(duì)象
“分布式管理對(duì)象 (DMO)”是一組 COM 對(duì)象,它將“SQL Server”數(shù)據(jù)庫(kù)和復(fù)制管理封裝在一起。這意味著您可以編寫(xiě)一個(gè) WSH 腳本,將特定表中的所有數(shù)據(jù)都復(fù)制到用制表符分隔的文件中,這有助于大量數(shù)據(jù)的移動(dòng)。我之所以選擇這個(gè)示例,是因?yàn)樗拇a編寫(xiě)起來(lái)簡(jiǎn)單,但 DMO 允許您獲取“SQL Server”中的每個(gè)對(duì)象,使您能夠編寫(xiě)出一些非常優(yōu)秀而有意義的管理腳本。
DMO 的關(guān)鍵是 SQLDMO.SQLServer 對(duì)象,它是基本的對(duì)象,它允許您連接到服務(wù)器并獲取所有可用對(duì)象。在這種情況下,我將使用 Database 集合來(lái)選擇數(shù)據(jù)庫(kù),然后從 table 集合訪問(wèn)要轉(zhuǎn)儲(chǔ)到文件的表。如果不提供數(shù)據(jù)庫(kù),將出現(xiàn)錯(cuò)誤消息,并且腳本也就結(jié)束了。如果不提供表名,腳本將在數(shù)據(jù)庫(kù)所有的表中循環(huán),并導(dǎo)出非系統(tǒng)表。如果提供了數(shù)據(jù)庫(kù),它就導(dǎo)出該表。該示例雖然功能有限,但它為“SQL Server”提供了基于命令行的簡(jiǎn)單的導(dǎo)出實(shí)用程序,您可以以它為根據(jù)。
現(xiàn)在先看一段代碼:
'聲明與 sql 談話時(shí)使用的變量Dim oServer ' SQL Server 對(duì)象Dim oDatabase ' 要使用的目標(biāo)數(shù)據(jù)庫(kù)Dim oBCP ' BCP 對(duì)象Dim nRows ' 從 bcp 返回的行數(shù)dim table ' 表對(duì)象on error resume next' 第一個(gè)參數(shù)必須是數(shù)據(jù)庫(kù)if WScript.Arguments(0) = "" then WScript.Echo "您沒(méi)有提供要連接的數(shù)據(jù)庫(kù)" WScript.Quitend if' 創(chuàng)建 SQL DMO 的實(shí)例Set oServer = CreateObject("SQLDMO.SQLServer")' 創(chuàng)建 SQL DMO Bulkcopy 對(duì)象的實(shí)例Set oBCP = CreateObject("SQLDMO.BulkCopy")oServer.EnableBcp = True' 登錄到本地服務(wù)器' 希望您已經(jīng)更改了 sa 口令!!oServer.Connect ".", "sa" ' 連接到提供的數(shù)據(jù)庫(kù)Set oDatabase = oServer.Databases(Wscript.Arguments(0))' 將分隔符設(shè)置為逗號(hào)oBCP.ColumnDelimiter = vbComma' 將文件類(lèi)型設(shè)置為以逗號(hào)分隔oBCP.DataFileType = SQLDMODataFile_CommaDelimitedCharoBCP.ImportRowsPerBatch = 1000oBCP.MaximumErrorsBeforeAbort = 1BCP.RowDelimiter = vbCrLfoBCP.ServerBCPDataFileType = SQLDMOBCPDataFile_CharoBCP.UseExistingConnection = True' 如果未提供表,則轉(zhuǎn)儲(chǔ)所有的表f wscript.Arguments(1) = "" then for each table in oDatabase.tables ' 確保該表不是系統(tǒng)表 if table.systemobject = false then oBCP.DataFilePath = table.name & ".csv" nRows = table.ExportData(oBCP) wscript.Echo nRows & " rows exported from " & table.name end if nextelse ' 設(shè)置輸出文件 oBCP.DataFilePath = wscript.Arguments(1) & ".csv" nRows = oDatabase.Tables(wscript.arguments(1)).ExportData(oBCP) wscript.Echo nRows & " rows exported from " & wscript.arguments(1)end if
DMO 的全部?jī)?nèi)容要比本文介紹的多得多,但我希望本文能給您一些感性認(rèn)識(shí):用某些簡(jiǎn)單的 WSH 腳本和 DMO 可以做些什么。您可以下載我的 示例(英文) 。有關(guān) DMO 的詳細(xì)信息,請(qǐng)?jiān)L問(wèn) http://msdn.microsoft.com/library/psdk/sql/9_dmoc01.htm(英文) 。
數(shù)據(jù)轉(zhuǎn)換服務(wù)
導(dǎo)出到 Comma Separated 文件 (CSV),可以作為將數(shù)據(jù)導(dǎo)出到 SQL 和從 SQL 導(dǎo)入的起點(diǎn),但這不象是尖端科技(太過(guò)于 20 世紀(jì)了,您不覺(jué)得嗎?)。“SQL Server 7.0”以“數(shù)據(jù)轉(zhuǎn)換服務(wù) (DTS)”的形式,提供了相當(dāng)完善的導(dǎo)入和導(dǎo)出機(jī)制。幸運(yùn)的是,腳本在“SQL Server”的這個(gè)新領(lǐng)域中仍有一席之地,因此,您可以用“Visual Basic(R) 腳本編輯 (VBScript)”、“JScript(R)”或“Perl”的技術(shù)來(lái)擴(kuò)展 DTS 的能力。
DTS 的設(shè)置非常簡(jiǎn)單,特別是在使用“SQL ServerEnterprise Manager”的時(shí)候。在默認(rèn)情況下,“SQL Server”有一個(gè)定義的文件夾,可存儲(chǔ)任何轉(zhuǎn)換,而且“Enterprise Manager”提供了創(chuàng)建和編輯 DTS 程序包的大的圖形用戶(hù)界面 (GUI)。在下面的示例中,我選擇了已由 sqlexport.wsf 文件創(chuàng)建的 employees.csv 文件和“SQL Server”中的一個(gè)新表。DTA 程序包將創(chuàng)建該表,加載到 Text 文件中,然后運(yùn)行某個(gè)腳本,將數(shù)據(jù)轉(zhuǎn)換到“SQL Server”的表中。
DTS 程序包中的轉(zhuǎn)換,使腳本在整個(gè)轉(zhuǎn)換過(guò)程中保持運(yùn)行狀態(tài)。“SQL Enterprise Manager”提供的簡(jiǎn)單的腳本編輯器,有一個(gè) 語(yǔ)法分析腳本 按鈕。在運(yùn)行腳本之前,該按鈕將警告您腳本中的錯(cuò)誤。在轉(zhuǎn)換過(guò)程中,該腳本使用 VBScript 的 Cint 功能,將 employeeid 和 deptid 的輸入轉(zhuǎn)換為 int ,并將所有的電子郵件地址轉(zhuǎn)換為小寫(xiě)字母。
'**********************************************************************' Visual Basic 轉(zhuǎn)換腳本' 把每個(gè)源列復(fù)制到' 目標(biāo)列'***********************************************************************Function Main() DTSDestination("EmployeeID") = cint(DTSSource("Col001")) DTSDestination("FirstName") = DTSSource("Col002") DTSDestination("LastName") = DTSSource("Col003") DTSDestination("email") = lcase(DTSSource("Col004")) DTSDestination("extension") = DTSSource("Col005") DTSDestination("office") = DTSSource("Col006") DTSDestination("DeptID") = cint(DTSSource("Col007")) Main = DTSTransformStat_OKEnd Function
用 DTS,能夠采用某些完善的導(dǎo)入/導(dǎo)出機(jī)制,并使您能夠在轉(zhuǎn)換的任何一步中使用腳本。重要的是,要注意腳本可能不是操作數(shù)據(jù)的最佳方式 — 尤其是您的數(shù)據(jù)集很大的話。如果您有大量數(shù)據(jù)需要轉(zhuǎn)換,而且性能也很重要,則您可能需要考慮使用 Visual Basic 或 C++ 來(lái)創(chuàng)建 COM 組件,然后從 DTS 內(nèi)部調(diào)用該組件。也就是說(shuō),如果性能并不重要,并且要在數(shù)據(jù)導(dǎo)入/導(dǎo)出時(shí)對(duì)它進(jìn)行轉(zhuǎn)換,則腳本為您提供了實(shí)現(xiàn)這一點(diǎn)的靈活機(jī)制,并使您能夠?qū)⑺写a存儲(chǔ)到“SQL Server”數(shù)據(jù)庫(kù)中,使部署變得相當(dāng)簡(jiǎn)單。
關(guān)于 XML
目前,XML 看起來(lái)像是在應(yīng)用程序之間共享數(shù)據(jù)的最佳工具,所以“SQL Server”的所有管理肯定都得到了 XML 的好處。編寫(xiě)提取數(shù)據(jù)庫(kù)中所有數(shù)據(jù)的腳本,以及編寫(xiě)用編程的方法創(chuàng)建 XML 文檔的腳本,都是可能的。但是,如果您只要查詢(xún)“SQL Server”的話,最好使它在 XML 中返回?cái)?shù)據(jù),然后用腳本操作該 XML。“SQL Server”組最近發(fā)行了“SQL Server XML”技術(shù)的非正式版本,完全做到了這一點(diǎn)。
新的 XML 技術(shù)使用起來(lái)非常簡(jiǎn)單。實(shí)際上是對(duì)服務(wù)器發(fā)出 HTTP 請(qǐng)求,將查詢(xún)傳遞給服務(wù)器,而服務(wù)器返回 XML。為了舉例說(shuō)明,我創(chuàng)建了簡(jiǎn)單的 WSH 腳本,它向本地機(jī)器查詢(xún) North Wind 數(shù)據(jù)庫(kù)的雇員表中的所有數(shù)據(jù)。為訪問(wèn) XML,該腳本使用了“Internet Explorer 5.01”附帶的 XML 分析程序。此對(duì)象的美妙之處,在于它處理您所有的 HTTP 請(qǐng)求,并使您能夠同步調(diào)用。因?yàn)槟僖膊挥锰幚砣魏问录?qū)動(dòng)的程序,所以,它對(duì)編寫(xiě)腳本很有幫助。
該腳本非常簡(jiǎn)單。它創(chuàng)建了 XML 分析程序的實(shí)例,使用分析程序打開(kāi) URL,然后將結(jié)果保存為 .xml 文件。只需五行的腳本,不錯(cuò)吧!
' 設(shè)置請(qǐng)求的 url xmlpath = "http://localhost/Northwind?sql=select+*+from+employees+for+xml+auto"' 創(chuàng)建“XML 分析程序”的實(shí)例 Set myXMLDoc = CreateObject("Microsoft.XMLDOM") ' 不需要異步 myXMLDoc.async = false ' 加載該 URL myXMLDoc.Load xmlpath ' 保存文檔 myXMLDoc.save "employees.xml"
它的強(qiáng)大之處在于,現(xiàn)在可很容易地與服務(wù)器建立遠(yuǎn)程連接并轉(zhuǎn)儲(chǔ)數(shù)據(jù);只要更改 URL,您早已做過(guò)了。此例告訴您如何導(dǎo)出,但是您可以輕松地寫(xiě)出導(dǎo)入例行程序,用 XML 分析程序在 XML 中反復(fù)操作并將值插入數(shù)據(jù)庫(kù)中。
摘要
“SQL Server”提供全面的可編寫(xiě)腳本的機(jī)制,用于本地或遠(yuǎn)程管理數(shù)據(jù)庫(kù)。DMO 和 DTS 已經(jīng)上市(實(shí)際上,DMO 已發(fā)行了許多版本),所以您可以直接利用它們,使您的數(shù)據(jù)庫(kù)管理任務(wù)自動(dòng)化。Windows 2000 已與“Windows Script Host 2.0”一起上市,所以以上所有腳本的運(yùn)行,都不受裝有“SQL Server”的 Windows 2000 服務(wù)器的條件限制。“SQL Server”中新的 XML 技術(shù)使存取數(shù)據(jù)變得輕而易舉,從而使編寫(xiě)“SQL Server”的腳本更加容易。有關(guān)“SQL Server”的詳細(xì)信息,請(qǐng)?jiān)L問(wèn) SQL Server Developer enter(英文) 。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=3214
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
