• SQL升级脚本实现按版本差异化升级


    目前的项目里面,升级脚本是一个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='00008'
    declare @ppp varchar(2000)
    -- 从注册表获取软件的安装路径
    declare @Path varchar(1000)
    exec master..xp_regread 'HKEY_LOCAL_MACHINE','SOFTWAREMicrosoftWindowsCurrentVersionApp PathsXXX','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才能保证执行。

  • 相关阅读:
    复制、删除、移动文件、获取文件的版本信息、更改文件属性,删除只读文件
    How to use the MQ?
    StreamReader、 StreamWriter
    我的第一个AJAX程序
    XML操作
    SQL 使用XML数据修改语言
    认识 ASP.NET 3.5 MVC 路由解析分析
    北京2008奥运会开幕式&闭幕式下载(NBCBT附字幕)
    认识 ASP.NET 3.5 MVC 路由 理解默认路由表
    每天都有新发现 2009年10月21日 Decimal 和存储过程OUTPUT
  • 原文地址:https://www.cnblogs.com/codingnote/p/3232538.html
Copyright © 2020-2023  润新知