目前的项目里面,升级脚本是一个SQL文件,无论软件从哪个版本升级,都会把SQL文件里面的语句全部执行一遍,这样存在两个问题:

1.SQL升级文件很庞大,几M很常见,导致文件的加载很慢;

2.重复执行脚本内容,性能很低。

但是目前的局限是安装包启动的升级程序,只能读取一个指定文件名的SQL脚本,脚本是批处理形式的,带了大量的GO,所以不能通过

if xxx

begin

  升级脚本

end

的形式来处理(语法不支持),于是只能另想办法,每一个版本生成一个Update脚本,通过一个调度脚本来决定执行哪些升级脚本。

这样就必须使用到xp_cmdshell和osql。考虑到升级的时候,升级程序并不能告诉脚本sa密码和当前账套,所以调度脚本里面必须做相关

处理;由于客户的电脑可能安装了不止一个版本的SQL Server,比如SQL Server 2000、SQL Server 2008 R2等,所以使用osql的时候

要加入数据库实例名的参数。

调度脚本内容如下:

EXEC sp_configure 'xp_cmdshell', 1
GO
--重新配置
RECONFIGURE
GO
-- 获取当前的数据名
declare @dbname varchar(100)
select @dbname= db_name()
-- 获取当前数据库的版本号
declare @ver varchar(100)
select @ver = s_content from systeminfo where s_fullid=''
declare @ppp varchar(2000)
-- 从注册表获取软件的安装路径
declare @Path varchar(1000)
exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\XXX','Path',@Path output
-- 组装版本升级脚本的绝对路径
select @path=@path+'\服务器\SQL\'
-- 生成osql执行命令语句,指定SQL Server实例名,数据库名,信任连接,脚本绝对路径。
select @ppp = 'osql -S '+@@ServerName+' -n -d '+@dbname+' -O -E -i '+@path+'tt1.sql'
--print @ver
-- 根据版本好决定执行哪些升级脚本
if @ver <'10.0.0.9'
exec master..xp_cmdshell @ppp
EXEC sp_configure 'xp_cmdshell', 0
GO
--重新配置
RECONFIGURE
GO

然后把升级版本放到软件安装目录下的\服务器\SQL\里面,这里只演示了执行一个脚本tt1.sql。

这里要注意一点是,升级脚本的语句块后面必须加一个GO才能保证执行。

SQL升级脚本实现按版本差异化升级的更多相关文章

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

    1.增加了对SQL Server 2000的兼容: 2.支持对脚本目录的批量处理: 3.将脚本版本的判断放到具体的升级子脚本中去,让调度脚本更固化. -- 根据SQL的版本好确定启用xp_cmdshe ...

  2. asp.net 版本一键升级,后台直接调用升级脚本

    应客户需求,要求实现一个版本一键升级的功能,咨询过同事之后弄了个demo出来,后台代码如下: //DBConnModelInfo:连接字符串的对象 (包含数据库实例名,数据库名,登陆名,登陆密码) p ...

  3. LNMP1.4 PHP升级脚本

    升级PHP前,请确认你的网站程序是否支持升级到的PHP版本,防止升级到网站程序不兼容的PHP版本,具体可以去你使用的PHP程序的官网查询相关版本支持信息.v1.3及以后版本大部分情况下也可以进行降级操 ...

  4. 从CentOS 7.0升级到7.7版本

    我平时都在VirtualBox上装虚拟机,方法是导入ova镜像文件,比如导入从网上下载的CentOS7-base.ova,该ova为CentOS 7.0版本,而现在最新版本为7.7,为此进入系统后第一 ...

  5. LNMP PHP升级脚本

    升级PHP前,请确认你的网站程序是否支持升级到的PHP版本,防止升级到网站程序不兼容的PHP版本,具体可以去你使用的PHP程序的官网查询相关版本支持信息.v1.3及以后版本大部分情况下也可以进行降级操 ...

  6. 由于@@ServerName等问题对SQL增量升级脚本进行补充

    由于@@ServerName在安装数据库之后修改了机器名的情况下,获取到的内容仍然是原来的机器名,造成数据库连接失败, 所以不能直接使用该全局变量. 此外对升级脚本的执行方式做了一下调整,将版本的判断 ...

  7. 无法升级数据库....因为此版本的 SQL Server 不支持该数据库的非发布版本(539) 解决方案

    使用SQL2012附加一个数据库时报出了以下错误:“无法升级数据库....因为此版本的 SQL Server 不支持该数据库的非发布版本(539).不能打开与此版本的 sqlserver.exe 不兼 ...

  8. 出错场景是升级oracle驱动,将版本从ojdbc14升级到ojdbc6,hibernate执行原生态sql语句会报如下错误

    出错场景是升级oracle驱动,将版本从ojdbc14升级到ojdbc6,hibernate执行原生态sql语句会报如下错误:org.hibernate.MappingException: No Di ...

  9. CENTOS 7 升级内核版本(附带升级脚本)

    写在前面的话 对于系统而言,除非是那种安全性要求非常高的公司或者经常会有第三方安全机构对其漏洞扫描的才容易涉及到系统的内核升级,比如之前呆过一个公司,因为需要做三级等保的原因,就会涉及到系统扫描,这时 ...

随机推荐

  1. Grunt备忘录

    一.安装Grunt 应在全局环境下安装Grunt,以保障在任何目录下都能够正确找到grunt npm install grunt-cli -g 二.对已有Grunt基本目录结构文件进行操作 Grunt ...

  2. javascript百度地图添加一个普通标注点(2014-3-8 记)

    1.导入jquery.js文件:<script type="text/javascript" src="js/jquery.js"></scr ...

  3. ionic 总结

    希望大家都能有了好东西分享出来,单单就ionic来说,我是刚接触,现在用的人不是很多. 我认为如果大家能 有了好的东西或者好的方案 不藏着掖着,分享出来,那么我们的社区会更加活跃,用的人会越来越多,解 ...

  4. iframe显示错误页面

    当系统出现异常时,ifrme中显示的内容为错也页面,而不是罪顶层的框架显示错误内容,此时的解决办法是在错误页面或相关的登录页面中加入 错误页面加载的JS如下 <script type=" ...

  5. nginx 配置文件备份

    1. /etc/nginx/sites-enabled/default 的原始文件 # You may add here your # server { # ... # } # statements ...

  6. HierarchyViewer for iOS 2.0 BETA Introduction

    We know HierarchyViewer is an useful tool in Android SDK. The developer and tester, who haven't the ...

  7. [转载]win32 计时器使用

    在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位机定时向下位机发送命令和传送数据等.特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要精 ...

  8. anaconda win10安装报错:UnicodeDecodeError解决方法

    Traceback (most recent call last): File , in <module> import conda.cli File , in <module> ...

  9. Linux 概念架构的理解

    摘要 Linux kernel 成功的两个原因: 架构设计支持大量的志愿开发者加入到开发过程中: 每个子系统,尤其是那些需要改进的,都支持很好的扩展性. 正是这两个原因使得 Linux kernel ...

  10. Spring 定时任务1

    转载自 http://blog.csdn.net/prisonbreak_/article/details/49180307 Spring配置文件xmlns加入 xmlns:task="ht ...