原文: 使用SQLCMD在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

/* SCRIPT: CREATE_DB.sql */
/* 创建TestDB数据库 */-- This is the main caller for each script
SET NOCOUNT ON
GOPRINT '开始创建TestDB数据库'
IF EXISTS (SELECT 1 FROM SYS.DATABASES WHERE NAME = 'TestDB')
DROP DATABASE TestDB
GO
CREATE DATABASE TestDB
GO:On Error exit:r c:\Scripts\CREATE_TABLES.sql
:r c:\Scripts\TABLE_INSERTS.sql
:r c:\Scripts\CREATE_INDEXES.sql
:r c:\Scripts\CREATE_PROCEDURES.sqlPRINT '创建完毕'
GO

脚本2:CREATE_INDEXES.sql

/* 创建索引 */
PRINT '开始创建索引'
GO
USE TestDB
GO
IF NOT EXISTS ( SELECT  1FROM    SYS.INDEXESWHERE   NAME = 'IX_EMPLOYEE_LASTNAME' ) CREATE INDEX IX_EMPLOYEE_LASTNAME ON DBO.EMPLOYEE(LASTNAME, FIRSTNAME)
GO
IF NOT EXISTS ( SELECT  1FROM    SYS.INDEXESWHERE   NAME = 'IX_TIMECARD_EMPLOYEEID' ) CREATE INDEX IX_TIMECARD_EMPLOYEEID ON DBO.TIMECARD(EMPLOYEEID)
GO

脚本3:CREATE_PROCEDURES.sql

/* 创建存储过程 */
PRINT '正在创建存储过程'
GO
USE TestDB
GO
IF OBJECT_ID('GET_EMPLOYEE_TIMECARDS') IS NOT NULL DROP PROCEDURE DBO.GET_EMPLOYEE_TIMECARDS
GO
CREATE PROCEDURE DBO.GET_EMPLOYEE_TIMECARDS @EMPLOYEEID INT
AS SET NOCOUNT ONSELECT  *FROM    DBO.EMPLOYEE EJOIN DBO.TIMECARD T ON E.EMPLOYEEID = T.EMPLOYEEIDWHERE   E.EMPLOYEEID = @EMPLOYEEIDORDER BY DATEWORKEDGO

脚本4:CREATE_TABLES.sql

/* 创建数据表 */
PRINT '正在创建数据表 '
GO
USE TestDB
GO
IF OBJECT_ID('EMPLOYEE') IS NOT NULL DROP TABLE DBO.EMPLOYEE
GO
CREATE TABLE DBO.EMPLOYEE(EMPLOYEEID INT IDENTITY(1, 1)NOT NULLPRIMARY KEY ,FIRSTNAME VARCHAR(50) ,LASTNAME VARCHAR(50))
GOIF OBJECT_ID('TIMECARD') IS NOT NULL DROP TABLE DBO.TIMECARD
GO
CREATE TABLE DBO.TIMECARD(TIMECARDID INT IDENTITY(1, 1)NOT NULLPRIMARY KEY ,EMPLOYEEID INT NOT NULL ,HOURSWORKED TINYINT NOT NULL ,HOURLYRATE MONEY NOT NULL ,DATEWORKED DATETIME NOT NULL)
GODECLARE @TOTAL_TABLES INT
SET @TOTAL_TABLES = 2

脚本5:TABLE_INSERTS.sql

/* 插入表数据 */PRINT 'TOTAL TABLES CREATED = ' + CAST(@TOTAL_TABLES AS VARCHAR)
GO
PRINT '正在插入数据到表 EMPLOYEE'
GO
USE TestDB
GO
INSERT  INTO DBO.EMPLOYEE( FIRSTNAME, LASTNAME )SELECT  'JOHN' ,'DOE'
GO
INSERT  INTO DBO.EMPLOYEE( FIRSTNAME, LASTNAME )SELECT  'JANE' ,'DOE'
GO
INSERT  INTO DBO.EMPLOYEE( FIRSTNAME, LASTNAME )SELECT  'JEFF' ,'DOE'
GO

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

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

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

双击文件可以看到:

在执行前,是没有TestDB:

执行中:

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

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

总结:

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

使用SQLCMD在SQLServer执行多个脚本相关推荐

  1. sqlserver date转nvarchar_数据库干货:整理SQLServer非常实用的脚本

    今天给大家分享自己在工作当中用到的SQLServer一些常用的脚本,希望能对大家有所帮助! 1. 查询数据库所有表结构 通过该脚本可以快速查找表字段,或者生成数据库设计文档.进行数据库对比. SELE ...

  2. python cgi root运行_如何执行Python CGI脚本?

    我想在.shtml中执行Python CGI脚本 文件,但我不知道怎么做.我已经找到好几种方法了?,但似乎什么也没用.在那里,很难找到一个真正展示如何执行脚本而不是如何编写脚本的东西!:/ 我对CGI ...

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

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

  4. RAC安装时需要执行4个脚本及意义

    RAC安装时需要执行4个脚本 1) $ORACLE_BASE/oraInventory/orainstRoot.sh (clusterware 结束时执行) 2) $CRS_HOME/root.sh  ...

  5. 安装WebDriverAgent时,执行bootstrap.sh脚本报错提示:ERROR in ./js/app.js的解决方法

    在安装WebDriverAgent时,执行bootstrap.sh脚本阶段报错,报错信息如图: 解决步骤如下: 1.修改WebDriverAgent目录下的Inspector目录中的webpack.c ...

  6. 【ijkplayer】编译 Android 版本的 ijkplayer ⑥ ( 进入 ijkplayer-android/android 目录 | 执行 compile-ijk.sh 脚本完成编译 )

    文章目录 一.进入 ijkplayer-android/android 目录 二.执行 compile-ijk.sh 脚本 参考 https://github.com/bilibili/ijkplay ...

  7. 【ijkplayer】编译 Android 版本的 ijkplayer ② ( 切换到 k0.8.8 分支 | 执行 init-android.sh 脚本进行初始化操作 )

    文章目录 一.进入 ijkplayer-android 目录 二.切换到 k0.8.8 分支 三.执行 init-android.sh 脚本进行初始化操作 参考 https://github.com/ ...

  8. 详解在 Linux 启动时,如何自动执行命令或脚本

    2019独角兽企业重金招聘Python工程师标准>>> 我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情.按下开机键或启动一个虚拟机,你就启动了一系列事件,之后 ...

  9. Azkaban实战,Command类型单一job示例,任务中执行外部shell脚本,Command类型多job工作flow,HDFS操作任务,MapReduce任务,HIVE任务

    1.Azkaban实战 Azkaba内置的任务类型支持command.java Command类型单一job示例 1.创建job描述文件 vi command.job #command.job typ ...

最新文章

  1. 超图桌面版根据现有数据源制作一幅地图简单操作
  2. iphone查看删除的短信_想要恢复已经删除的的短信怎么办?
  3. .net post的参数如果出现乱码如何解决!
  4. 2021年黑龙江高考成绩查询,黑龙江省招生考试信息港:2021年黑龙江高考成绩查询入口、查分系统...
  5. 变形二叉树中节点的最大距离(树的最长路径)——非递归解法
  6. ubuntu 22.04安装独立显卡驱动方法以及一些问题,以及安装pytorchcuda和cudnn的问题
  7. Win7 和 xp 双系统安装
  8. 解决“你没有权限访问,请与网络管理员联系”
  9. 软件开发中项目经理有那些职责
  10. 怎么画思维导图?玩转MindNow六大思维结构
  11. 正则表达式中,[\s\S]* 什么意思
  12. 产品基础能力研习:CRM系统
  13. 服务器拷文件突然自动关机,windows server 2008R2自动关机解决方法
  14. Jasper Report 6.8 根据后台数据生成动态报表(JRXML文件实现)(三)JRXML文件生成过程(支持json,bean,map list数据源)
  15. 开放api接口签名验证
  16. 论文笔记- AdaDepth: Unsupervised Content Congruent Adaptation for Depth Estimation
  17. Grub for DOS/NTLDR中文版Climbing定制版第四版(完全淘汰VFloppy)
  18. 【日常训练】Help Far Away Kingdom(Codeforces 99A)
  19. 英语名言API 推荐
  20. Auto.js 写入通讯录、清空通讯录

热门文章

  1. js中json的添加和指定位置的删除
  2. centos 7 配置nginx
  3. 哪位有方法把 dd/mm/yyyy的字符串 格式化成yyyy-mm-dd
  4. php include和require
  5. CSS的优先级和继承性
  6. Name与x:Name的关系--转载
  7. 设计模式笔记 10.Facade 外观模式(结构型模式)
  8. python爬虫实例电商_价值上千元的Python爬虫外包案例,学会你就赚了
  9. python数据帧_Python数据帧
  10. 【Paper】论文中定义、定理、引理、证明分别的含义