使用SQL-DMO实现定制SQL Scripts

      我是个负责数据库应用的开发人员,昨夜和旧同事电话聊天中谈到了一个
  大家共同的苦恼:因为几乎每天都要将自己的数据库项目生成SQL Scripts
  以供备份存档或发给客户更新,所以生成SQL Scripts就成了每天的必修课。
  而SQLSERVER的企业管理器又无法支持将生成SQL Scripts的过程保存为一个设置
  文件,每次都必须做许多相同的工作,
  如:选择对象呀、设置格式呀、表脚本选项、文件选项。。老是重复这样的操作
  实在太麻烦了!电话闲聊完后就想:能不能写个小工具,在可以提供SQLSERVER
  企业管理器所支持所有功能外,再增加个支持将各个选项的设置保存为
  配置文件(如:ini或XM格式)的功能呢?这样我以后只要选取不同的配置文件就可以
  直接生成出自己需要的Scripts格式,那样多好呀。。。
      但如何实现Scripts的生成呢?就考虑使用下以前很少用的SQL-DMO吧!
  心动不如行动,虽然夜已深,但有新鲜的体验总让我精神抖擞。。。呵呵,好了
  不废话了。。就先简单地谈谈如何使用SQL-DMO来实现自己的需求吧~~~~
      (代码示例使用Pascal语言表述)
   
      1. 枚举局域网内所有的SQLSERVER实例
      函数:
           function GetAllServerInstances :TStringList;
           var
             oApplication ,
             oSeverNameList : Variant ;
             i : integer ;
             sNameList : TStringList ;
           begin
             sNameList := TStringList.Create ;
             oApplication := CreateOLEObject ('SQLDMO.Application') ;
             oSeverNameList := oApplication.ListAvailableSQLServers ;
             for i:= 1 to oSeverNameList.Count do
               sNameList.Append (oSeverNameList.Item(i)) ;
             Result := sNameList ;
             oApplication := NULL;
             oSeverNameList := NULL;
           end;
        
      2.登陆到指定的SQLSERVER实例
      函数:
           function LoginServerInstances (sServer,sUser,sPassword :string):Variant;
           var
             oSQLServer : Variant ;
           begin
             oSQLServer := CreateOLEObject  ('SQLDMO.SQLServer');
             oSQLServer.LoginTimeout := 30;
             oSQLServer.LoginSecure := False;
             oSQLServer.AutoReconnect := True;
             oSQLServer.Connect(sServer,sUser,sPassword);
             Result := oSQLServer;
             oSQLServer := NULL ;
           end;
        
  以上两个函数可以帮助我们完成取得局域网内所有的SQLSERVER实例并且
  登陆上一个指定的实例。接下来就看看如何取得指定数据库的表名称和存储
  过程名称 :
 
       3.枚举指定Sqlserver实例所有database的名称
       函数:
           function GetAllDatabaseNameList (oSQLServer : Variant ):TStringList;
           var
             sNameList : TStringList ;
             i : integer;
           begin
             sNameList := TStringList.Create ;
             for i:= 1 to oSQLServer.Databases.Count do
               sNameList.Append (oSQLServer.Databases.Item(i).Name) ;
             Result := sNameList ;
           end;
       
       4.枚举指定数据库所有Table的名称
       函数:
            function GetAllTableNameList (oSQLServer : Variant ; sDataBaseName : string ):TStringList;
            var
              oDatabase : Variant ;
              sNameList : TStringList ;
              i : integer;
            begin
              sNameList := TStringList.Create ;
              oDatabase  := CreateOLEObject  ('SQLDMO.Database');
              oDatabase := oSQLServer.Databases.Item(sDataBaseName);
              for i:= 1 to oDatabase.Tables.Count do
                sNameList.Append (oDatabase.Tables.Item(i).Name) ;
              Result := sNameList ;
              oDatabase := Null ;
            end;

       5.枚举指定数据库所有StoreProcedure的名称
       函数:
            function GetAllStoreProcedureNameList (oSQLServer : Variant ; sDataBaseName : string ):TStringList;
            var
              oDatabase : Variant ;
              sNameList : TStringList ;
              i : integer;
            begin
              sNameList := TStringList.Create ;
              oDatabase  := CreateOLEObject  ('SQLDMO.Database');
              oDatabase := oSQLServer.Databases.Item(sDataBaseName);
              for i:= 1 to oDatabase.StoredProcedures.Count do
                sNameList.Append (oDatabase.StoredProcedures.Item(i).Name) ;
              Result := sNameList ;
              oDatabase := Null ;
            end; 
     
      通过以上3个函数就可以把生成Scripts前的准备工作做好了,然后就可以开始
  着重了解如何生成Scripts了。Scripts也同样是SQL-DMO某些对象的Method。这些
  对象如:Database,View ,StoredProcedure ,Trigger ,Check 等等。
  Scripts Method 的Syntax是:
    object.Script( [ ScriptType ] [, ScriptFilePath ] [, Script2Type ] ) as String
  ScriptType (integer type) 参数是来设定产生什么内容的Scripts ,如对其赋值SQLDMOScript_Default,
  这样就产生的是 该对象普通的脚本,如StoredProcedure object,那肯定就是
  其create StoredProcedure 的内容咯。如果赋值SQLDMOScript_Drops的话,
  那就产生的是drop object的内容。关于ScriptType,Script2Type (integer type)
  这个参数的详细使用可以  参阅 : C:\Program Files\Microsoft SQL Server\80\Tools\Books qldmo.chm
  的帮助文件。Script方法的返回值是文本类型,不管你填不填ScriptFilePath参数,
  你都能得到该文本,也就是Script 的内容。

      而Table ,UserDefinedDatatype 这两个对象生成Scripts的Method比较特殊,
  它们调用的是GenerateSQL Method,其Syntax是:
    object.GenerateSQL( Database ) as String ,比较简单没有过多的参数,返回值
  也是Script 的内容。
 
      建议:把ScriptType,Script2Type两个参数可以赋予的值做成常量,这样在程序
  中调用更直观些。如:SQLDMOScript_DatabasePermissions = 32;
  SQLDMOScript_Default = 4; ....
 
  根据上面的说明可以建立这个函数(在申明此函数时填加overload表示同名不同参函数的重载):
    file://6.生成指定Objects的Sql Scripts
    file://(oSqlObjcet : Database,View ,StoredProcedure ,Trigger ,Check)
    // sScriptFilePath defalut is ''
    function GetThisObjectScripts (oSqlObjcet : Variant ;sScriptFilePath : string ;
                                   iScriptType,iScript2Type : integer) : string ;
    begin
      Result := oSqlObjcet.Script(iScriptType,sScriptFilePath,iScript2Type) ;
    end;
    file://7.生成指定Objects的Sql Scripts
      // overload Method
      file://(oSqlObjcet : Table ,UserDefinedDatatype)
    function TForm1.GetThisObjectScripts (oDatabase ,oSqlObjcet : Variant ) : string ;
    begin
      Result := oSqlObjcet.GenerateSQL(oDatabase) ;
    end;
  
  调用的时候可以根据界面选择生成什么样格式的对象就传入相应的参数
  写个简单的例子,取出master的存储过程MS_sqlctrs_users的内容:
     procedure TForm1.Button4Click(Sender: TObject);
     var
       oSQLServer,
       oDatabase,
       oStoredProcedure : Variant ;
       ReturnStr : string;
     begin
       oDatabase  := CreateOLEObject  ('SQLDMO.Database');
       oSQLServer := LoginServerInstances('DAVID','sa','');
       oDatabase := oSQLServer.Databases.Item('master');
       oStoredProcedure := oSQLServer.Databases.Item('master').StoredProcedures.Item('MS_sqlctrs_users');
       file://生成create procedure的Scripts,将第一个4换成1就成了drop procedure的 Scripts了
       ReturnStr := GetThisObjectScripts(oStoredProcedure,'',4,4); 
       ShowMessage(ReturnStr);
     end; 

  如果多个对象都需要导出 Scripts 话,可以用个string 变量保存被循环调用的
  GetThisObjectScripts过程,就可以实现导出多个对象的脚本了!
 
 
  关于保存和取出配置生成Scripts的过程,我想不用详细描述了吧?
  只需把设置好的控件状态保存到配置文件中,并且可以调用配置文件
  反向对控件状态来设置,这样就简单的实现了自定义的过程呀。
  呵呵,到这里就进入尾声了,通过组合上面这些函数,
  并且设置合理的界面调用,这程序应该很容易完成吧~~~~
  既然这样,那让我们为提供自己工作效率而建立更多小工具呀!  
 
  更多详情,请参阅 :
  C:\Program Files\Microsoft SQL Server\80\Tools\Books qldmo.chm
 
 
 

时间: 2024-10-02 18:56:34

使用SQL-DMO实现定制SQL Scripts的相关文章

SQL预编译和SQL注入

再说SQL预编译: 最近用go语言时,学习了一下数据库连接的库,这里总结一下SQL预编译相关的知识.貌似网上都是建议使用预编译,我也觉得这种做法靠谱. 先谈 SQL注入: SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过让原SQL改变了语义,达到欺骗服务器执行恶意的SQL命令.其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统. 其实,反过来考虑,这也是SQL这类解释性语言本身的缺陷,安全和易用性总是相对的.类似的Sh

SQL Server 的工具--SQL Mail

   SQL Server 除了提供强大的管理工具Enterprise Manager. 可靠的安全性管理和数据库备份与恢复功能.内置的复制组件以外还包括其他一些工具和令人欣慰的功能.在本章中我们将分别介绍SQL Mail. SQL Server Profiler. Query Analyzer, 希望读者能够熟练地使用它们从而形成对SQL Server 的全面了解. 19.1.1 SQL Mail 简介    在SQL Server Agent 一章我们已经讲过当用户创建的警报被执行时,警报就

SQL循序渐进(24)嵌入SQL

嵌入SQL 为了更好的理解嵌入SQL,本节利用一个具体例子来说明.嵌入SQL允许程序连接数据库并且包括SQL代码到程序中,这样在程序中就可以对数据库进行使用.操作以及处理数据等等.以下是用C语言编写的使用嵌入SQL的例程,它将打印一个报告:这个程序必须在普通的编译之前先预编译SQL语句.嵌入SQL对于不同系统是不一样的,所以在不同的系统中对以下的程序稍作修改,特别是变量的声明以及过程记录等.在嵌入SQL时,考虑网络.数据库管理系统.操作系统是相当重要的. 以下是详细的代码: #include <

关于SQL Server 2000和SQL Server 2005分布式事务能否协同工作的测试

server|分布式 关于SQL Server 2000和SQL Server 2005分布式事务能否协同工作的测试 MS DTC Report 1.      MS DTC 背景 2.      MSDTC 测试目的 3.      MSDTC 测试环境 3.1            本次验证测试环境: 3.2            环境配置 3.3            验证MSDTC 3.4            创建验证用表 4.      Linked Server测试 5.     

[SQL Server]管理常用SQL语句

server|语句 [SQL Server]管理常用SQL语句 1. 查看数据库的版本        select @@version 2. 查看数据库所在机器操作系统参数        exec master..xp_msver 3. 查看数据库启动的参数         sp_configure 4. 查看数据库启动时间         select convert(varchar(30),login_time,120) from master..sysprocesses where spi

PL/SQL开发中动态SQL的使用方法

动态 内容摘要:在PL/SQL开发过程中,使用SQL,PL/SQL可以实现大部份的需求,但是在某些特殊的情况下,在PL/SQL中使用标准的SQL语句或DML语句不能实现自己的需求,比如需要动态建表或某个不确定的操作需要动态执行.这就需要使用动态SQL来实现.本文通过几个实例来详细的讲解动态SQL的使用. 本文适宜读者范围:Oracle初级,中级 系统环境: OS:windows 2000 Professional (英文版) Oracle:8.1.7.1.0 正文: 一般的PL/SQL程序设计中

MS SQL基础教程:SQL Server 2000简介

SQL Server 是一个关系数据库管理系统它最初是由Microsoft Sybase 和Ashton-Tate三家公司共同开发的于1988 年推出了第一个OS/2 版本在Windows NT 推出后Microsoft与Sybase 在SQL Server 的开发上就分道扬镳了Microsoft 将SQL Server 移植到Windows NT 系统上专注于开发推广SQL Server 的Windows NT 版本Sybase 则较专注于SQL Server在UNIX 操作系统上的应用在本书

MS SQL基础教程:SQL语言

SQL 语言是一种介于关系代数与关系演算之间的语言,其功能包括查询.操纵.定义和控制4 个方面,是一个通用的.功能极强的关系数据库语言. 4.1.1 SQL 概述 SQL 语言是1974 年由Boyce 和Chamberlin 提出的.1975 年至1979 年,IBM 公司San Jose Research Laboratory 研制的关系数据库管理系统原形系统System R 实现了这种语言.由于它功能丰富,语言简洁,使用方法灵活,倍受用户和计算机业界的青睐,被众多的计算机公司和软件公司采用

怎么让sql server中的sql语句自动换行

怎么让sql server中的sql语句自动换行呢? 如下图: 工具--选项--所有语言 查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/SQLServer/

MS SQL基础教程:SQL Server 2000的工具

1.3.4 Profiler SQL Server Profiler 是一个图形化的管理工具用于监督记录和检查SQL Server 数据库的使用情况对系统管理员来说它是一个监视用户活动的间谍 1.3.5 Client Network Utility SQL Server Client Network Utility 用于配置客户端的连接测定网络库的版本信息以及设定本地数据库的相关选项 1.3.6 Server Network Utility SQL Server Server Network U