设为首页 收藏本站
查看: 714|回复: 0

[经验分享] 使用SQL-DMO实现定制SQL Scripts

[复制链接]

尚未签到

发表于 2016-11-9 02:36:47 | 显示全部楼层 |阅读模式
(代码示例使用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/sqldmo.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/sqldmo.chm

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-297542-1-1.html 上篇帖子: 安装SQL Server 2008后,再安装Visual Studio 2008无法选择安装路径的解决方法 下篇帖子: SQL BCP命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表