日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

編寫(xiě)數(shù)據(jù)庫(kù)腳本

系統(tǒng) 2359 0

作者: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(英文)


Andrew Clinick 是“Microsoft Script Technology”組中的程序經(jīng)理,機(jī)會(huì)使然,只要涉及腳本,他就可能大顯身手一番。他的大部分業(yè)余時(shí)間都花在觀看美國(guó)電視臺(tái)轉(zhuǎn)播的精彩橄欖球賽,以及向他的美國(guó)同事解說(shuō)板球。

?



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=3214


編寫(xiě)數(shù)據(jù)庫(kù)腳本


更多文章、技術(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ì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 江永县| 修水县| 辽阳市| 自治县| 时尚| 灵武市| 遵义县| 平乡县| 苗栗市| 泽普县| 恩平市| 达州市| 措美县| 朝阳市| 马公市| 松潘县| 夏邑县| 内江市| 泽州县| 五台县| 澎湖县| 伊宁市| 秦皇岛市| 黔南| 富川| 嵩明县| 县级市| 天门市| 明光市| 东台市| 九龙城区| 丰顺县| 江山市| 尉犁县| 锦州市| 沂水县| 紫阳县| 外汇| 宾阳县| 武隆县| 乌拉特中旗|