来源:作者: 发布时间:2007-12-26 02:03:41


作者:andrew clinick
发表日期:2000 年 1 月 10 日
我在“if it moves, script it”(英文)这篇文章中曾谈到,怎样使用“windows script host(wsh)”( windows 脚本主机) 管理 windows 和 windows 中的应用程式。文中的大多数示例都是基于管理 windows 操作系统自身的,并不基于在该操作系统下运行的应用程式。为迎接新千年,我想我应该谈谈,怎样在众多显露可脚本化接口的应用程式中使用脚本。这次只涉及“sql server”。在以后的几个月中,我将着重谈 exchange、office 和“系统管理服务器”。 您能够通过使用“分布式管理对象”、“数据转换服务”和新的“sql server xml”实现,将脚本用于“sql server”。 许多人都能够通过“active data object(ado)”和“active server page (asp)”技术访问数据库了。ado 在帮助您查询和更新数据库方面做了大量的工作 ? 但在备份(y2k 问题带给我们的警惕)或是数据库之间的传输数据方面,其表现又怎样呢?而这时就非涉及到 xml 不可了。
在此,我将告诉您怎样通过使用 ado 的伴随技术 - 特别是“分布式管理对象”、“数据转换服务”和新的“sql server xml”实现,将脚本用于“sql server”。 分布式管理对象 “分布式管理对象 (dmo)”是一组 com 对象,他将“sql server”数据库和复制管理封装在一起。这意味着您能够编写一个 wsh 脚本,将特定表中的任何数据都复制到用制表符分隔的文档中,这有助于大量数据的移动。我之所以选择这个示例,是因为他的代码编写起来简单,但 dmo 允许您获取“sql server”中的每个对象,使您能够编写出一些很优秀而有意义的管理脚本。
dmo 的关键是 sqldmo.sqlserver 对象,他是基本的对象,他允许您连接到服务器并获取任何可用对象。在这种情况下,我将使用 database 集合来选择数据库,然后从 table 集合访问要转储到文档的表。假如不提供数据库,将出现错误消息,并且脚本也就结束了。假如不提供表名,脚本将在数据库任何的表中循环,并导出非系统表。假如提供了数据库,他就导出该表。该示例虽然功能有限,但他为“sql server”提供了基于命令行的简单的导出实用程式,您能够以他为根据。
现在先看一段代码:
声明和 sql 谈话时使用的变量dim oserver sql server 对象dim odatabase 要使用的目标数据库dim obcp bcp 对象dim nrows 从 bcp 返回的行数dim table 表对象on error resume next 第一个参数必须是数据库if wscript.arguments(0) = "" then wscript.echo "您没有提供要连接的数据库" wscript.quitend if 创建 sql dmo 的实例set oserver = createobject("sqldmo.sqlserver") 创建 sql dmo bulkcopy 对象的实例set obcp = createobject("sqldmo.bulkcopy")oserver.enablebcp = true 登录到本地服务器 希望您已更改了 sa 口令!!oserver.connect ".", "sa" 连接到提供的数据库set odatabase = oserver.databases(wscript.arguments(0)) 将分隔符配置为逗号obcp.columndelimiter = vbcomma 将文档类型配置为以逗号分隔obcp.datafiletype = sqldmodatafile_commadelimitedcharobcp.importrowsperbatch = 1000obcp.maximumerrorsbeforeabort = 1bcp.rowdelimiter = vbcrlfobcp.serverbcpdatafiletype = sqldmobcpdatafile_charobcp.useexistingconnection = true 假如未提供表,则转储任何的表f wscript.arguments(1) = "" then for each table in odatabase.tables 确保该表不是系统表 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 配置输出文档 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 的全部内容要比本文介绍的多得多,但我希望本文能给您一些感性认识:用某些简单的 wsh 脚本和 dmo 能够做些什么。您能够下载我的示例(英文)。有关 dmo 的周详信息,请访问 http://msdn.microsoft.com/library/psdk/sql/9_dmoc01.htm(英文)。 数据转换服务 导出到 comma separated 文档 (csv),能够作为将数据导出到 sql 和从 sql 导入的起点,但这不象是尖端科技(太过于 20 世纪了,您不觉得吗?)。“sql server 7.0”以“数据转换服务 (dts)”的形式,提供了相当完善的导入和导出机制。幸运的是,脚本在“sql server”的这个新领域中仍有一席之地,因此,您能够用“visual basic(r) 脚本编辑 (vbscript)”、“jscript(r)”或“perl”的技术来扩展 dts 的能力。
dts 的配置很简单,特别是在使用“sql serverenterprise manager”的时候。在默认情况下,“sql server”有一个定义的文档夹,可存储任何转换,而且“enterprise manager”提供了创建和编辑 dts 程式包的大的图像用户界面 (gui)。在下面的示例中,我选择了已由 sqlexport.wsf 文档创建的 employees.csv 文档和“sql server”中的一个新表。dta 程式包将创建该表,加载到 text 文档中,然后运行某个脚本,将数据转换到“sql server”的表中。
dts 程式包中的转换,使脚本在整个转换过程中保持运行状态。“sql enterprise manager”提供的简单的脚本编辑器,有一个语法分析脚本按钮。在运行脚本之前,该按钮将警告您脚本中的错误。在转换过程中,该脚本使用 vbscript 的 cint 功能,将 employeeid 和 deptid 的输入转换为 int,并将任何的电子邮件地址转换为小写字母。
********************************************************************** visual basic 转换脚本 把每个源列复制到 目标列***********************************************************************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,能够采用某些完善的导入/导出机制,并使您能够在转换的任何一步中使用脚本。重要的是,要注意脚本可能不是操作数据的最好方式 ? 尤其是您的数据集很大的话。假如您有大量数据需要转换,而且性能也很重要,则您可能需要考虑使用 visual basic 或 c++ 来创建 com 组件,然后从 dts 内部调用该组件。也就是说,假如性能并不重要,并且要在数据导入/导出时对他进行转换,则脚本为您提供了实现这一点的灵活机制,并使您能够将任何代码存储到“sql server”数据库中,使部署变得相当简单。 关于 xml 现在,xml 看起来像是在应用程式之间共享数据的最好工具,所以“sql server”的任何管理肯定都得到了 xml 的好处。编写提取数据库中任何数据的脚本,连同编写用编程的方法创建 xml 文档的脚本,都是可能的。但是,假如您只要查询“sql server”的话,最好使他在 xml 中返回数据,然后用脚本操作该 xml。“sql server”组最近发行了“sql server xml”技术的非正式版本,完全做到了这一点。
新的 xml 技术使用起来很简单。实际上是对服务器发出 http 请求,将查询传递给服务器,而服务器返回 xml。为了举例说明,我创建了简单的 wsh 脚本,他向本地机器查询 north wind 数据库的雇员表中的任何数据。为访问 xml,该脚本使用了“internet explorer 5.01”附带的 xml 分析程式。此对象的美妙之处,在于他处理您任何的 http 请求,并使您能够同步调用。因为您再也不用处理任何事件驱动的程式,所以,他对编写脚本很有帮助。
该脚本很简单。他创建了 xml 分析程式的实例,使用分析程式打开 url,然后将结果保存为 .xml 文档。只需五行的脚本,不错吧!
配置请求的 url xmlpath = "http://localhost/northwind?sql=select+*+from+employees+for+xml+auto" 创建“xml 分析程式”的实例 set myxmldoc = createobject("microsoft.xmldom") 无需异步 myxmldoc.async = false 加载该 url myxmldoc.load xmlpath 保存文档 myxmldoc.save "employees.xml"
他的强大之处在于,现在可很容易地和服务器建立远程连接并转储数据;只要更改 url,您早已做过了。此例告诉您怎样导出,但是您能够轻松地写出导入例行程式,用 xml 分析程式在 xml 中反复操作并将值插入数据库中。 摘要 “sql server”提供全面的可编写脚本的机制,用于本地或远程管理数据库。dmo 和 dts 已上市(实际上,dmo 已发行了许多版本),所以您能够直接利用他们,使您的数据库管理任务自动化。windows 2000 已和“windows script host 2.0”一起上市,所以以上任何脚本的运行,都不受装有“sql server”的 windows 2000 服务器的条件限制。“sql server”中新的 xml 技术使存取数据变得轻而易举,从而使编写“sql server”的脚本更加容易。有关“sql server”的周详信息,请访问 sql server developer enter(英文)。
andrew clinick 是“microsoft script technology”组中的程式经理,机会使然,只要涉及脚本,他就可能大显身手一番。他的大部分业余时间都花在观看美国电视台转播的出色橄榄球赛,连同向他的美国同事解说板球。
|
还没有关于此文章的相关评论!