概述:

作为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. Eclipse-将svn上的项目转化成相应的项目

    这里假设svn上的项目为maven项目 首先从svn检出项目 其中项目名称code可自己定义更改新的名称 从svn检出的项目结构 然后将项目转化成相关的项目 转换加载中 加载/下载 maven相关内容 ...

  2. 什么时候用Vector, 什么时候改用ArrayList?

    转自:http://www.cnblogs.com/langtianya/archive/2012/08/28/2659787.html 书得到的信息好像是Vector是从java1开始就有了,Arr ...

  3. 【Matplotlib】 移动spines

    相关文档: Spines Axis container Transformations tutorial Spines 是连接轴刻度标记的线,而且标明了数据区域的边界. 他们可以被放置在任意位置.直到 ...

  4. javaScript基础练习题-下拉框制作(CSS)

    http://www.imooc.com/video/155 慕课网的视频,直接上代码 <!DOCTYPE hmtl> <html> <head> <meta ...

  5. UVA 1626 Brackets sequence(括号匹配 + 区间DP)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105116#problem/E 题意:添加最少的括号,让每个括号都能匹配并输出 分析:dp ...

  6. js中改变不同的div属性值的操作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. linux4

    linux 特点:1.免费 开源(代码公开)2.支持多线程/多用户的操作系统3.安全性4.对内存和文件管理有自己的一套优越的方法 linux最小只需要4M ->嵌入式开发默认不启动用户界面roo ...

  8. 【2011图灵奖得主】我眼中的Judea Pearl

    [2011图灵奖得主]我眼中的Judea Pearl 来源: 叶星遥的日志 2011年的图灵奖花落UCLA计算机系的Judea Pearl教授.图灵奖是计算领域的最高奖,由于近年来这个领域的兴盛也算是 ...

  9. iOS项目工作空间搭建

    一般公司的项目都是一个工作空间包包含两个项目,一个主项目,一个Pods项目,当然也有些就是一个项目,然后把第三方放在项目的文件夹里. 这样做的好处是,项目再次拷贝到其他地方报错的可能性小,而且拷完就能 ...

  10. xcode6.3插件失效

    1.打开终端,输入以下代码:defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID 2.获取到DV ...