在数据库开发和维护过程中,经常需要将SQL Server数据库中的对象导出为文本文件。这样做的好处是可以进行自动化的数据库构建和版本控制。本文将介绍一种使用SQL-DMO COM对象将SQL Server对象导出为文本文件的方法。
SQL-DMO(SQL Distributed Management Objects)是一组COM对象,用于程序化地管理SQL Server。本文将使用SQL-DMO的SQLDMO.SQLServer2接口,通过VBScript脚本实现对象的导出。
本文的主要目的是展示如何使用SQL-DMO COM对象将SQL Server对象导出为文本文件。虽然还有其他方法可以实现这一功能,但本文将专注于使用VBScript脚本。
要使用本文提供的脚本,需要按照以下步骤操作:
cscript 0g_sqlextract.vbs [server] [database] [output folder] [username] [password]
其中,各参数的含义如下:
例如,使用Windows认证连接SQL Express实例的命令如下:
cscript 0g_sqlextract.vbs localhost\my-sql-instance mydatabase c:\sqloutput
使用SQL Server认证连接SQL 2000服务器的命令如下:
cscript 0g_sqlextract.vbs localhost mydatabase c:\sqloutput sa mypassword
脚本分为三个主要部分:
以下是脚本中定义的一些常量:
const SQLDMODep_Children = 262144
const SQLDMODep_OrderDescending = 131072
const SQLDMOScript_DRI_AllConstraints = 520093696
const SQLDMOScript_ToFileOnly = 64
const SQLDMOScript_OwnerQualify = 262144
const SQLDMOScript_PrimaryObject = 4
const SQLDMOScript_ObjectPermissions = 2
const SQLDMOScript_IncludeIfNotExists = 4096
const SQLDMOScript_Indexes = 73736
const SQLDMOScript_Triggers = 16
const SQLDMOScript_Drops = 1
const SQLDMOScript_DRI_All = 532676608
const SQLDMOScript_NoIdentity = 1073741824
这些常量用于Script方法调用时,以生成包含约束定义、触发器等信息的脚本。
Main子程序读取参数,创建SQLDMO.SQLServer2对象,并根据参数使用Windows认证或SQL Server认证连接数据库。连接成功后,调用ScriptObjects子程序对数据库中的表、视图、存储过程和用户定义函数进行脚本化。
sub Main
dim objArgs
Set objArgs = WScript.Arguments
if objArgs.Count > 2 then
connString = objArgs(0)
database = objArgs(1)
folder = objArgs(2)
dim user, pw
Set oSql = WScript.CreateObject("SQLDMO.SQLServer2")
if objArgs.Count > 4 then
user = objArgs(3)
pw = objArgs(4)
StdOut.Echo "SQL Authentication - Connection to database"
oSql.LoginSecure = False
oSql.Connect connString, user, pw
else
StdOut.Echo "Windows Authentication - Connection to database"
oSql.LoginSecure = True
oSql.Connect connString
end if
call ScriptObjects(oSQL.Databases(database).Tables, "TAB", "Reading tables: ")
call ScriptObjects(oSQL.Databases(database).Views, "VIW", "Reading views: ")
call ScriptObjects(oSQL.Databases(database).StoredProcedures, "PRC", "Reading procedures: ")
call ScriptObjects(oSQL.Databases(database).UserDefinedFunctions, "UDF", "Reading functions: ")
oSql.Disconnect
else
StdOut.Echo "Usage: sqlextract.vbs [server or sql instance name] [database] [output folder]"
end if
set oSql = nothing
if err.Description <> "" then
StdOut.Echo err.Description
end if
end sub
ScriptObjects子程序遍历列表中的元素,确保对象不是系统对象,然后使用定义的选项生成脚本。
sub ScriptObjects(list, ext, msg)
Dim object
StdOut.Echo ""
StdOut.Echo msg
dim options
options = SQLDMOScript_Indexes OR SQLDMOScript_Drops OR SQLDMOScript_IncludeIfNotExists OR SQLDMOScript_OwnerQualify OR SQLDMOScript_PrimaryObject Or SQLDMODep_Children Or SQLDMOScript_DRI_AllConstraints Or SQLDMODep_OrderDescending Or SQLDMOScript_ObjectPermissions Or SQLDMOScript_ToFileOnly OR SQLDMOScript2_NoCollation OR SQLDMOScript_Triggers OR SQLDMOScript_DRI_All
For Each object In list
If Not object.SystemObject Then
StdOut.Echo object.Name
object.Script options, GetFolderName(ext) + "\" + object.Owner + "." + object.Name + "." + ext
End If
Next
end sub
function GetFolderName(ext)
dim tmpFolder
tmpFolder = ""
select case ext
case "TAB"
tmpFolder = TAB_FOLDER
case "VIW"
tmpFolder = VIW_FOLDER
case "PRC"
tmpFolder = PROC_FOLDER
case "UDF"
tmpFolder = UDF_FOLDER
end select
CreateFolder folder + tmpFolder
GetFolderName = folder + tmpFolder
end function
sub CreateFolder(path)
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
if not fso.FolderExists(path) then
fso.CreateFolder(path)
end if
set fso = nothing
end sub