`
baobaojinjin
  • 浏览: 142427 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

sqlserver 制作批处理脚本

 
阅读更多

概述:

 

       作为DBA,经常要用开发人员提供的SQL脚本来更新正式数据库,但是一个比较合理的开发流程,当提交脚本给DBA执行的时候,可能已经有几百个sql文件,并且有执行顺序,如我现在工作的公司,十几个客户,每个客户一个库,但是数据库结构、存储过程、视图等都是一模一样,每次执行脚本(以下称为升级),如果有一百个脚本,那么就要按顺序执行过千次,这种工作量可不是一个人能承受得了的。

 

解决方法:

 

应对这种情况有以下几种方法:

 

1、  购买第三方软件(一般估计很少人买)

 

2、  自己编程一个小软件来执行,但是这个逻辑性要求比较高,而且编程的能力要有一定层次,这个我暂时没有。

 

3、  使用本文介绍的方法,至于是啥,接着看:

 

使用SQLCMD在SQLServer上执行多个脚本:

 

             SQLCMD:使用 sqlcmd 实用工具,可以在命令提示符处、在 SQLCMD 模式下的查询编辑器中、在 Windows 脚本文件中或者在SQL Server 代理作业的操作系统 (Cmd.exe) 作业步骤中输入 Transact-SQL 语句、系统过程和脚本文件。 此实用工具使用 ODBC 执行 Transact-SQL批处理。(来源于MSDN)详细语法可以到网上查找,这里就不贴出来。

 

       SQLCMD有一个很重要的命令::r,记住,SQLCMD是大小写敏感的。当:r发现正在运行SQL脚本,它会告诉SQLCMD把这个文件所引用的文件一并放入调用脚本中。这将告诉你,停止目前的单个查询。并重新调整查询,把应该关联的查询放到适当的位置。另外,使用:r命令在一个批处理中执行多个脚本,使得你可以定义一个单独的变量集,用于包含所有脚本,但是不包含GO终结符。2005以后引入SQLCMD,可以用于将来替代osql工具。如果你不熟悉SQLCMD,可以认为它是一个能从操作系统执行T-SQL命令和脚本的命令行工具。

 

       下面例子中,创建5个作用在TestDB数据库上有关联的sql文件。第一个脚本叫做CREATE_DB.sql,用于创建一个叫做TestDB的数据库。这个脚本包含了4个其他的脚本(使用了:r命令。),用于生成其他表、表插入、索引创建和存储过程的创建。一个.bat文件用于创建用来执行SQLCMD命令。

 

 

第一步:先创建一个在C盘下的文件夹:C:\Scripts。然后把脚本存放到这个文件夹中:

脚本1:CREATE_DB.sql

  1. /* SCRIPT: CREATE_DB.sql */  
  2. /* 创建TestDB数据库 */  
  3.   
  4. -- This is the main caller for each script  
  5. SET NOCOUNT ON  
  6. GO  
  7.   
  8. PRINT '开始创建TestDB数据库'  
  9. IF EXISTS (SELECT 1 FROM SYS.DATABASES WHERE NAME = 'TestDB')  
  10. DROP DATABASE TestDB  
  11. GO  
  12. CREATE DATABASE TestDB  
  13. GO  
  14.   
  15. :On Error exit  
  16.   
  17. :r c:\Scripts\CREATE_TABLES.sql  
  18. :r c:\Scripts\TABLE_INSERTS.sql  
  19. :r c:\Scripts\CREATE_INDEXES.sql  
  20. :r c:\Scripts\CREATE_PROCEDURES.sql  
  21.   
  22. PRINT '创建完毕'  
  23. GO  

 

脚本2:CREATE_INDEXES.sql

  1. /* 创建索引 */  
  2. PRINT '开始创建索引'  
  3. GO  
  4. USE TestDB  
  5. GO  
  6. IF NOT EXISTS ( SELECT  1  
  7.                 FROM    SYS.INDEXES  
  8.                 WHERE   NAME = 'IX_EMPLOYEE_LASTNAME' )   
  9.     CREATE INDEX IX_EMPLOYEE_LASTNAME ON DBO.EMPLOYEE(LASTNAME, FIRSTNAME)  
  10. GO  
  11. IF NOT EXISTS ( SELECT  1  
  12.                 FROM    SYS.INDEXES  
  13.                 WHERE   NAME = 'IX_TIMECARD_EMPLOYEEID' )   
  14.     CREATE INDEX IX_TIMECARD_EMPLOYEEID ON DBO.TIMECARD(EMPLOYEEID)  
  15. GO  


脚本3:CREATE_PROCEDURES.sql

  1. /* 创建存储过程 */  
  2. PRINT '正在创建存储过程'  
  3. GO  
  4. USE TestDB  
  5. GO  
  6. IF OBJECT_ID('GET_EMPLOYEE_TIMECARDS'IS NOT NULL   
  7.     DROP PROCEDURE DBO.GET_EMPLOYEE_TIMECARDS  
  8. GO  
  9. CREATE PROCEDURE DBO.GET_EMPLOYEE_TIMECARDS @EMPLOYEEID INT  
  10. AS   
  11.     SET NOCOUNT ON  
  12.   
  13.     SELECT  *  
  14.     FROM    DBO.EMPLOYEE E  
  15.             JOIN DBO.TIMECARD T ON E.EMPLOYEEID = T.EMPLOYEEID  
  16.     WHERE   E.EMPLOYEEID = @EMPLOYEEID  
  17.     ORDER BY DATEWORKED  
  18.   
  19. GO  


脚本4:CREATE_TABLES.sql

  1. /* 创建数据表 */  
  2. PRINT '正在创建数据表 '  
  3. GO  
  4. USE TestDB  
  5. GO  
  6. IF OBJECT_ID('EMPLOYEE'IS NOT NULL   
  7.     DROP TABLE DBO.EMPLOYEE  
  8. GO  
  9. CREATE TABLE DBO.EMPLOYEE  
  10.     (  
  11.       EMPLOYEEID INT IDENTITY(1, 1)  
  12.                      NOT NULL  
  13.                      PRIMARY KEY ,  
  14.       FIRSTNAME VARCHAR(50) ,  
  15.       LASTNAME VARCHAR(50)  
  16.     )  
  17. GO  
  18.   
  19. IF OBJECT_ID('TIMECARD'IS NOT NULL   
  20.     DROP TABLE DBO.TIMECARD  
  21. GO  
  22. CREATE TABLE DBO.TIMECARD  
  23.     (  
  24.       TIMECARDID INT IDENTITY(1, 1)  
  25.                      NOT NULL  
  26.                      PRIMARY KEY ,  
  27.       EMPLOYEEID INT NOT NULL ,  
  28.       HOURSWORKED TINYINT NOT NULL ,  
  29.       HOURLYRATE MONEY NOT NULL ,  
  30.       DATEWORKED DATETIME NOT NULL  
  31.     )  
  32. GO  
  33.   
  34. DECLARE @TOTAL_TABLES INT  
  35. SET @TOTAL_TABLES = 2  


脚本5:TABLE_INSERTS.sql

  1. /* 插入表数据 */  
  2.   
  3. PRINT 'TOTAL TABLES CREATED = ' + CAST(@TOTAL_TABLES AS VARCHAR)  
  4. GO  
  5. PRINT '正在插入数据到表 EMPLOYEE'  
  6. GO  
  7. USE TestDB  
  8. GO  
  9. INSERT  INTO DBO.EMPLOYEE  
  10.         ( FIRSTNAME, LASTNAME )  
  11.         SELECT  'JOHN' ,  
  12.                 'DOE'  
  13. GO  
  14. INSERT  INTO DBO.EMPLOYEE  
  15.         ( FIRSTNAME, LASTNAME )  
  16.         SELECT  'JANE' ,  
  17.                 'DOE'  
  18. GO  
  19. INSERT  INTO DBO.EMPLOYEE  
  20.         ( FIRSTNAME, LASTNAME )  
  21.         SELECT  'JEFF' ,  
  22.                 'DOE'  
  23. GO  


 

第二步:在C盘根目录下创建一个bat文件create_db.bat,用于执行SQLCMD:

 

  1. SQLCMD -E -dmaster -ic:\Scripts\create_db.sql  
  2. PAUSE  

 


第三步:在C盘下直接执行bat文件:

 

双击文件可以看到:

在执行前,是没有TestDB:

 

执行中:

 

执行后,该创建的东西都创建出来了:

 

 

由于执行的顺序已经在脚本1中定义好,所以直接执行即可,并且执行成功。

 

总结:

             根据个人经验,还是开发一个批量执行工具会比较好,这个方法在少量脚本的时候可以选用。

 
分享到:
评论

相关推荐

    Installanywhere打包javaweb项目

    sql : 这里用于存放你从本地库中导出的数据库脚本.sql文件,具体也不一定会用到 ,主要看后面的脚本如何编写 my.ini: 这是windows下的配置文件,配置了mysql的信息,解压版中是没有该文件的 手动创建一个,内容...

    jsp servlet 入门学习资料-新手一看就懂

    11.1.3 批处理更新 11.1.4 对Java对象的持久性 11.1.5 数据库连接池使用实例 11.2 文件上载 11.2.1 实现机理 11.2.2 文件上载实例 第12章 JSP高级应用实例:网上书店 12.1 概述 12.2 扩展标签的使用 12.2.1...

    JSP高级编程

    书中的代码还在如下平台进行了测试: RedhatUnux 6.1 Apache l.3.12 TOmcat 3.1 BEA Weblogic 4.51 数据库系统主要使用了Microsoft SQL Server 7.0,部分代码使用了MySQL。作者 2000.11 前言 第一部分 JSP入门 第...

    JSP高级教程

    11.1.3 批处理更新 11.1.4 对Java对象的持久性 11.1.5 数据库连接池使用实例 11.2 文件上载 11.2.1 实现机理 11.2.2 文件上载实例 第12章 JSP高级应用实例:网上书店 12.1 概述 12.2 扩展标签的使用 12.2.1...

    jsp从入门到高级编程

    3.4.1 Tomcat的主配置文件:server.xml 3.4.2 Windows下代码保护的问题 3.4.3 Apache、IIS和Tomcat协作时工作 目录的添加 3.4.4 设定Tomcat作为Windows的服务而启动 3.4.5 在Tomcat中建立新的Web应用程序 第4章...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    书名:《Java开发实战1200例(第I卷)》(清华大学出版社.李钟尉,陈丹丹) PDF格式扫描版,全书分为24章,共817页。2011年1月出版。 全书压缩打包成4部分,这是第3部分 注:本系列图书的第I、II卷再版时均相应改名为...

    C#编程经验技巧宝典

    C#编程经验技巧宝典源代码,目录如下: 第1章 开发环境 1 <br>1.1 Visual Studio开发环境安装与配置 2 <br>0001 安装Visual Studio 2005开发环境须知 2 <br>0002 配置合适的Visual Studio 2005...

    网管教程 从入门到精通软件篇.txt

    BAT:批处理文件 BIN:二进制文件 BINHex:苹果的一种编码格式 BMP:Windows或OS/2位图文件 BOOK:Adobe FrameMaker Book文件 BOX:Lotus Notes的邮箱文件 BPL:Borlard Delph 4打包库 BSP:Quake图形文件 ...

Global site tag (gtag.js) - Google Analytics