使用SQL-DMO将SQL Server对象导出为文本文件

在数据库开发和维护过程中,经常需要将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脚本。

使用方法

要使用本文提供的脚本,需要按照以下步骤操作:

  1. 确保系统上安装了SQL Server 2000/2005或MSDE/Express。
  2. 准备一个VBScript脚本文件,例如命名为0g_sqlextract.vbs。
  3. 使用命令行工具(如cmd.exe)运行脚本,命令格式如下:
cscript 0g_sqlextract.vbs [server] [database] [output folder] [username] [password]

其中,各参数的含义如下:

  • [server]:服务器位置/IP地址/实例名称
  • [database]:数据库名称/初始目录
  • [output folder]:文件输出的文件夹(必须存在)
  • [username]:用户(可选 - SQL认证)
  • [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

脚本解析

脚本分为三个主要部分:

  1. 常量声明:用于提供不同的脚本选项。
  2. Main:处理参数验证,并调用ScriptObjects子程序。
  3. ScriptObjects:遍历集合中的元素,对每个对象进行脚本化。

以下是脚本中定义的一些常量:

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
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485