概述:

作为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. -- This is the main caller for each script
  4. SET NOCOUNT ON
  5. GO
  6. PRINT '开始创建TestDB数据库'
  7. IF EXISTS (SELECT 1 FROM SYS.DATABASES WHERE NAME = 'TestDB')
  8. DROP DATABASE TestDB
  9. GO
  10. CREATE DATABASE TestDB
  11. GO
  12. :On Error exit
  13. :r c:\Scripts\CREATE_TABLES.sql
  14. :r c:\Scripts\TABLE_INSERTS.sql
  15. :r c:\Scripts\CREATE_INDEXES.sql
  16. :r c:\Scripts\CREATE_PROCEDURES.sql
  17. PRINT '创建完毕'
  18. 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. SELECT  *
  13. FROM    DBO.EMPLOYEE E
  14. JOIN DBO.TIMECARD T ON E.EMPLOYEEID = T.EMPLOYEEID
  15. WHERE   E.EMPLOYEEID = @EMPLOYEEID
  16. ORDER BY DATEWORKED
  17. 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. IF OBJECT_ID('TIMECARD') IS NOT NULL
  19. DROP TABLE DBO.TIMECARD
  20. GO
  21. CREATE TABLE DBO.TIMECARD
  22. (
  23. TIMECARDID INT IDENTITY(1, 1)
  24. NOT NULL
  25. PRIMARY KEY ,
  26. EMPLOYEEID INT NOT NULL ,
  27. HOURSWORKED TINYINT NOT NULL ,
  28. HOURLYRATE MONEY NOT NULL ,
  29. DATEWORKED DATETIME NOT NULL
  30. )
  31. GO
  32. DECLARE @TOTAL_TABLES INT
  33. SET @TOTAL_TABLES = 2

脚本5:TABLE_INSERTS.sql

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

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

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

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

双击文件可以看到:

在执行前,是没有TestDB:

执行中:

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

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

(转)使用SQLCMD在SQLServer执行多个脚本的更多相关文章

  1. 使用SQLCMD在SQLServer执行多个脚本

    原文:使用SQLCMD在SQLServer执行多个脚本 概述: 作为DBA,经常要用开发人员提供的SQL脚本来更新正式数据库,但是一个比较合理的开发流程,当提交脚本给DBA执行的时候,可能已经有几百个 ...

  2. 使用SQLCMD在SQLServer执行多个脚本 转载

    出处不明 概述: 作为DBA,经常要用开发人员提供的SQL脚本来更新正式数据库,但是一个比较合理的开发流程,当提交脚本给DBA执行的时候,可能已经有几百个sql文件,并且有执行顺序,如我现在工作的公司 ...

  3. 解决 SqlServer执行脚本,文件过大,内存溢出问题

    原文:解决 SqlServer执行脚本,文件过大,内存溢出问题 执行.sql脚本文件,如果文件较大时,执行会出现内存溢出问题,可用命令替代 cmd 中输入 osql -S 127.0.0.1,8433 ...

  4. 分享一张SQLSERVER执行流程的图片

    分享一张SQLSERVER执行流程的图片 有天论坛里有人问,一时间并发连接很多,是不是可以在SSMS里配置连接池 连接池是属于客户端的,配置只能在连接字符串里配置,修改你的连接字符串,SSMS没有一个 ...

  5. 查询SQLSERVER执行过的SQL记录(历史查询记录)

    有的时候,需要知道近段时间SQLSERVER执行了什么语句,可以用下面的方法: SELECT TOP 1000 QS.creation_time, SUBSTRING(ST.text, (QS.sta ...

  6. Bat:Basic knowledge(同时运行多条命令,连接SqlServer执行sql,单个bat打开多个tomcat,cmd切换命令行编码,根据PID结束端口号)

    1.Windows7环境下命令行一次运行多条命令 Windows7命令行(cmd)下,如果想一次运行多条命令可能用到的连接符个人了解到的有三个:&&,||和&. aa & ...

  7. 查询SQLSERVER执行过的SQL记录(历史查询记录)(转)

    原文链接:https://www.cnblogs.com/icycore/p/10493237.html 有的时候,需要知道近段时间SQLSERVER执行了什么语句,可以用下面的方法: SELECT ...

  8. 查看oracle数据库下面的所有的表,执行某个sql脚本:

    查看oracle数据库下面的所有的表: select * from user_tables;//user为用户名 执行某个sql脚本: SQL>@e 文件名.sql

  9. 设置开机启动时指定非ROOT用户执行相应的脚本

    [root@MSJTVL-MJSP-A01 sm01]# vim /etc/rc.d/rc.local #!/bin/sh # # This script will be executed *afte ...

随机推荐

  1. Jquery-获取同级标签prev,prevAll,next,nextAll

    1.next([expr]): 获取指定元素的下一个同级元素(注意是下一个同级元素哦) 参数可有可无,参数设定遵循jquery选择器规则 <!DOCTYPE html> <html& ...

  2. Java-Stack

    package 集合类.list类; import java.util.Date; import java.util.Stack; /** * stack类继承与vector类 * @author j ...

  3. Spring对Hibernate的session生效期(事物提交管理)介绍

    在Hibernate中我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据操作,然后提交事务,关闭事务,这样做的原因是因为Hibernate默认的事务自动提交是false,它是需要人为的手动 ...

  4. 【BZOJ-2809】dispatching派遣 Splay + 启发式合并

    2809: [Apio2012]dispatching Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2334  Solved: 1192[Submi ...

  5. codeforces 359D 二分答案+RMQ

    上学期刷过裸的RMQ模板题,不过那时候一直不理解>_< 其实RMQ很简单: 设f[i][j]表示从i开始的,长度为2^j的一段元素中的最小值or最大值 那么f[i][j]=min/max{ ...

  6. iOS应用支持IPV6

    一.IPV6-Only支持是啥? 首先IPV6,是对IPV4地址空间的扩充.目前当我们用iOS设备连接上Wifi.4G.3G等网络时,设备被分配的地址均是IPV4地址,但是随着运营商和企业逐渐部署IP ...

  7. P1067Warcraft III 守望者的烦恼(十大矩阵问题之七求递推式)

    https://vijos.org/p/1067 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她 ...

  8. C# 参考之方法参数关键字:params、ref及out

    如果在为方法声明参数时未使用 ref 或 out,则该参数可以具有关联的值.可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值.通过使用方法参数关键字,可以更改这种行为. params ...

  9. CentOS 6.4安装Apache+MySQL+PHP的图文教程

    LAMP 实际上就是 Linux.Apache.MySQL.PHP 四个名称的缩写,当然最后一个 “P” 还有其他说法是 Perl 或者 Python.不用多说了,本文讲解的就是 Linux.Apac ...

  10. TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!

    /** * * @author ocq */ class Parent implements Comparable { private int age = 0; public Parent(int a ...