编写数据库脚本[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 ghj1976 的 blog

作者: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.quit
end 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_commadelimitedchar
obcp.importrowsperbatch = 1000
obcp.maximumerrorsbeforeabort = 1
bcp.rowdelimiter = vbcrlf
obcp.serverbcpdatafiletype = sqldmobcpdatafile_char
obcp.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
	next
else
	' 设置输出文件
	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”的表中。


本文关键:编写数据库脚本
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top