编码笔记

导航

SQL升级脚本实现按版本差异化升级(优化)

1.增加了对SQL Server 2000的兼容;

2.支持对脚本目录的批量处理;

3.将脚本版本的判断放到具体的升级子脚本中去,让调度脚本更固化。

 

-- 根据SQL的版本好确定启用xp_cmdshell的方式。
declare @DBVersion varchar(50)
select @DBVersion= cast(serverproperty('productversion') as varchar(50))
declare @index int
select @index = charindex('.',@DBVersion)
select @DBVersion = substring(@DBVersion,1,@index-1)
-- 如果是2000及其以下版本
if cast(@DBVersion as integer) <=8
begin
    if not exists(select id from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell')
        exec master..sp_addextendedproc 'xp_cmdshell','xplog70.dll'
end
else
begin
    EXEC sp_configure 'xp_cmdshell', 1
    RECONFIGURE
end
GO

-- 获取当前的数据名
declare @dbname varchar(100)
select @dbname= db_name()
-- 获取当前数据库的版本号
declare @ver varchar(100)
select @ver = s_content from systeminfo where s_fullid='00008'
declare @ppp varchar(2000)
-- 从注册表获取软件的安装路径
declare @Path varchar(1000)
declare @FileFullName varchar(1000)
declare @DicPath varchar(1000)
-- XXX是应用程序写入注册表的节点名称
exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\XXX','Path',@Path output
-- 组装版本升级脚本的绝对路径
select @FileFullName=@path+'\服务器\SQL\'
-- 生成osql执行命令语句,指定SQL Server实例名,数据库名,信任连接,脚本绝对路径。
select @ppp = 'osql -S '+@@ServerName+' -n -d '+@dbname+' -O -E -i '+@FileFullName     
-- 升级脚本路径
select @DicPath = 'dir '+@FileFullName+'tt*.sql /b'
-- 通过一个临时表存放升级脚本
create table #patchlist(patchname varchar(100))
insert into #patchlist
EXEC master..xp_cmdshell @DicPath
-- 循环执行升级脚本。
declare @FileName    varchar(100)
DECLARE patchs CURSOR FOR SELECT patchname FROM #patchlist
OPEN patchs
FETCH NEXT FROM patchs into @FileName
WHILE @@FETCH_STATUS = 0
begin
    if isnull(@FileName,'') <> ''
    begin
        select @FileName = @ppp+@FileName
        exec master..xp_cmdshell @FileName
    end
    FETCH NEXT FROM patchs into @FileName    
end
drop table #patchlist
close patchs
deallocate patchs
GO
-- 根据SQL的版本号确定关闭xp_cmdshell的方式。
declare @DBVersion varchar(50)
select @DBVersion= cast(serverproperty('productversion') as varchar(50))
declare @index int
select @index = charindex('.',@DBVersion)
select @DBVersion = substring(@DBVersion,1,@index-1)
if cast(@DBVersion as integer) <=8
begin
    if exists(select id from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell')
        Exec master..sp_dropextendedproc 'xp_cmdshell'
end
else
begin
    EXEC sp_configure 'xp_cmdshell', 0
    RECONFIGURE
end
GO

 

posted on 2013-08-05 11:06  封三郎  阅读(692)  评论(0编辑  收藏  举报