在SQL Server 中使用SQLDMO

server

 

曾几何时,伙伴们为数据库的升级伤透了脑筋.往往程序的升级赶不上数据库的升级(版本控制的好,这也许不是什么问题,但对于很大一部分中国公司来说这是无法避免的).而有些n久以前的数据库要使用新程序的时候,数据库的升级简直就是无从下手.所以对比数据库升级的紧要性就逐渐的凸现出来.对于表和字段的升级按道理来说是不难的,通过sysobjects与syscolumns的比较很容易的可以找到不同之处,然后增加没有的对象即可.而对于视图和存储过程等非表对象的更新就有些为难了(当然视图和存储过程如果用手工的办法是很简单的).一个在于如何生成对象脚本,另一个在于如何执行.大家都知道syscomments表中藏有此类对象的脚本,人们肯定会优先考虑开采这个宝库.当站在字符型变量最大只能存储8000个字符时,这简直就是一个不可逾越的障碍.人们又想从导出文本脚本然后执行这个思路着手时,又发现从字段中取出的脚本有个天然的缺陷:换行问题.(最后发

现,这个问题也是可以解决的).万般无奈下人们把渴望的目光集中到了SQLDMO上,她的身上总散发着无所不能的光芒.

当Transfer对象的美妙身材展现在人们眼前的时候,大家都对她的美丽所折服——这不正是我们所寻找的吗?她的动人之处就在于可以把一个数据库的对象脚本保存在内存中,然后连接到另一个数据库上执行.太棒了!现在我们来看看她的轮廓吧:

重要属性:

CopyAllDefaults                         Boolean             所有默认值

CopyAllObjects                          Boolean             所有对象

CopyAllRules                             Boolean             所有规则

CopyAllStoredProcedures           Boolean                    所有存储过程

CopyAllTables                            Boolean             所有表

CopyAllTriggers                         Boolean             所有触发器

CopyAllUserDefinedDatatypes      Boolean                       所有用户自定义类型

CopyAllViews                             Boolean             所有视图

CopyData                                   Boolean             所有数据

DestDatabase                                    String               目标对象数据库

DestLogin                                  String               目标数据库登陆用户名

DestPassword                             String               目标数据库登陆密码

DestServer                                 String               目标服务器

DestUseTrustedConnection          Boolean                  用户信任连接

DropDestObjectsFirst                  Boolean             是否先删除目标对象

IncludeDependencies                   Boolean             是否包含依靠对象

ScriptType                                  Boolean             脚本类型

重要方法:

AddObject                   增加对象

AddObjectByName            通过对象名称增加对象

好了,大家应该对这个对象略有些了解了.对SQLDMO熟悉的人也许一下子就可以从中得到灵感,而初学者在这里恐怕还是一头雾水.不过不用着急,具体用法我们会慢慢道来:

CREATE PROCEDURE  P_UDB --以源数据库为模板升级目标数据库

(  @Source_DB                  sysname                     --原数据库

  ,@Des_DB                     sysname                     --目标数据库

  ,@UserName                   sysname                     --用户名

  ,@psw                        sysname                     --密码

 )

 AS

set nocount on

--/*  局部变量声明

declare  @ObjName              sysname

                 ,@SrvID            int                     --服务器ID

                 ,@DBsId            int                     --数据库集ID

                 ,@transferID      int                     --传输ID

                 ,@SDBId            int                     --源数据库ID

                 ,@DDBID            int                     --目标数据库ID

                 ,@SViewListID     int                     --源数据库视图列表 

                 ,@DViewListID     int                     --目标数据库视图列表 

                 ,@str              Nvarhar(4000)

                 ,@name             sysname

                 ,@hr               int                    --执行语句返回值

                 ,@Error           int                       --错误返回值(999:存储过程或触发器错误;9999:视图错误)

--*/            

--/*创建sqldmo对象  前面我们已经说过SQLDMO是个com,在SQL Server中使用OLE --自动化对象需要用到sp_OACreate等一系列的存储过程,读者如果有不明白的可以自--己查阅相关资料

exec @hr=sp_oacreate 'SQLDMO.sqlserver',@SrvID output

if @hr<>0

begin

  set @Error=1

  goto PEnd

end

--*/

--/*连接服务器

exec @hr=sp_oamethod @SrvID,'connect',null,@@ServerName,@UserName,@psw

if @hr<>0

begin

  set @Error=2

  goto PEnd

end

--*/

--/*取数据库集

exec @hr=sp_oagetproperty @SrvID,'databases',@DBsId output

--*/

--/*选择源数据库   

exec @hr=sp_oamethod @DBsId,'item',@SDBId output,@Source_DB

if @hr<>0

begin

  set @Error=3

  goto PEnd

end

--*/

--/*选择目标数据库   

exec @hr=sp_oamethod @DBsId,'item',@DDBId output,@Des_DB

if @hr<>0

begin

  set @Error=4

  goto PEnd

end

--*/

/*Tansfer属性设置(生成三大对象)

exec @hr=sp_oacreate         'SQLDMO.Transfer',@transferID output

exec @hr=sp_oasetproperty   @transferID,'DestServer',@@ServerName

exec @hr=sp_oasetproperty   @transferID,'DestLogin',@UserName

exec @hr=sp_oasetproperty   @transferID,'DestPassword ',@psw

exec @hr=sp_oasetproperty   @transferID,'DestDatabase',@des_DB

exec @hr=sp_oasetproperty   @transferID,'DropDestObjectsFirst ',1

exec @hr=sp_oasetproperty   @transferID,'CopyAllStoredProcedures ',1

exec @hr=sp_oasetproperty   @transferID,'CopyAllTriggers',1

exec @hr=sp_oasetproperty   @transferID,'CopyAllViews',1

--exec @hr=sp_oasetproperty   @transferID,'ScriptType ',1 这里大家可以试试这个属性

exec @hr=sp_oamethod  @DDBId,'Transfer ',null,@transferID

exec sp_OADestroy @TransferID 

if @hr<>0

  begin

    set @Error=10

    goto PEnd

  end

*/

PEnd:

  exec @hr = sp_OAMethod @SrvID, 'DisConnect' 

  exec sp_OADestroy @SrvID 

  print (@Error)

  Return (@Error)

GO

上边的存储过程只要是介绍方法的实现,而具体的功能比如表及字段的比较生成这里就省略了.

其实有一个大家最后也没能解决好的问题就是对象依赖的问题.许多对象比如视图里嵌视图,这时生成与执行需要有顺序的.虽然有算法但有缺陷.希望读者能可以提供好的算法.

 

时间: 2024-09-05 17:03:14

在SQL Server 中使用SQLDMO的相关文章

.NET和SQL Server中“空值”辨析

server 初学数据库编程我们可能会有一些对"空值"的疑问,比如通过编程新建的一个表中所有数据皆显示为<NULL>,手动添加并删除文字后又变成了空白:一个字符串类型的字段,明明没有填值,却不等于"":用ADO.NET从数据库中取值,每遇到有<NULL>的就出错--这需要我们正确认识.NET和SQL Server中几种不同的"空值".1.真正的空值,也就是"没有输入的值",可以出现在大多数类型的字段中(

sql server中扩展存储过程随笔(几个有用的PROCEDURE小总结)

server|存储过程 在sql server中扩展存储过程直接使用的机会不是很多 我把我知道的几个有用的扩展存储过程使用方式总结如下:     --获得MS SQL的版本号 execute master..sp_msgetversion go Character_Value                              -------------------- ----------- ----------- 8.00.760             1           3  

分清SQL Server中易混淆的数据类型

server|数据|数据类型 (1)char.varchar.text和nchar.nvarchar.ntextchar和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是变长字符数据.所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度:而变长字符数据则不会以空格填充.text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符.后面三种数据类型和

从SQL Server中导入/导出 Excel 的基本方法

excel|server 从SQL Server中导入/导出 Excel 的基本方法 /*===================  导入/导出 Excel 的基本方法 ===================*/ 从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句: /*===================================================================*/--如果接受数据导入的表已经存在insert into 表 select

在SQL Server中快速删除重复记录

server|重复|重复记录 开发人员的噩梦--删除重复记录 想必每一位开发人员都有过类似的经历,在对数据库进行查询或统计的时候不时地会碰到由于表中存在重复的记录而导致查询和统计结果不准确.解决该问题的办法就是将这些重复的记录删除,只保留其中的一条. 在SQL Server中除了对拥有十几条记录的表进行人工删除外,实现删除重复记录一般都是写一段代码,用游标的方法一行一行检查,删除重复的记录.因为这种方法需要对整个表进行遍历,所以对于表中的记录数不是很大的时候还是可行的,如果一张表的数据达到上百万

sql server中的外键约束

server sql server中建立外键约束有3中方式:1.Enterprise Manager中,Tables,Design Table,设置Table的properties,   可以建立constraint, reference key;2.Enterprise Manager中,Diagrams, new Diagrams,建立两个表的关系.3.直接用transact sql语句. 三个方法都需要先建立数据表.-- 创建表author :CREATE TABLE [dbo].[aut

Sql Server中的日期与时间函数

Sql Server中的日期与时间函数: 1.  当前系统日期.时间     select getdate()  2. dateadd  在向指定日期加上一段时间的基础上,返回新的 datetime 值:   例如:向日期加上2天    select dateadd(day,2,'2004-10-15')  --返回:2004-10-17 00:00:00.000 3. datediff 返回跨两个指定日期的日期和时间边界数:   select datediff(day,'2004-09-01'

漫谈SQL Server中的标识列(一)

server 漫谈SQL Server中的标识列(一) 一.标识列的定义以及特点 SQL Server中的标识列又称标识符列,习惯上又叫自增列.该种列具有以下三种特点: 1.列的数据类型为不带小数的数值类型2.在进行插入(Insert)操作时,该列的值是由系统按一定规律生成,不允许空值3.列值不重复,具有标识表中每一行的作用,每个表只能有一个标识列. 由于以上特点,使得标识列在数据库的设计中得到广泛的使用. 二.标识列的组成创建一个标识列,通常要指定三个内容:1.类型(type)在SQL Ser

使用sql server中的全文索引

server|索引 Author:David Euler. Date:2004/09/11 Email:de_euler-david@yahoo.com.cn 有任何问题,请与我联系:) 一般情况,使用sql server中的全文索引,经过大体4个步骤: 1).安装full text search全文索引服务; 2).为数据表建立full text catalog全文索引目录; 3).进行full text catalog的population操作(使全文索引与数据表内容同步); 4).使用全文