概述:

作为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. Spring-编程式事物

    所谓编程式事务指的是通过编码方式实现事务,即类似于JDBC编程实现事务管理. Spring框架提供一致的事务抽象,因此对于JDBC还是JTA事务都是采用相同的API进行编程. Connection c ...

  2. 【ZOJ 3897】Candy canes//Fiddlesticks

    题 题意 给你一串数,a1...an,从左到右每次让一个数减小c,如果这个数小于c,那就减为0.第n个数减小后,又从第一个开始从左到右.如果这次某个数减小到0,那就改变方向,如果遇到已经是0的,就跳过 ...

  3. codevs1358 棋盘游戏

    题目描述 Description 这个游戏在一个有10*10个格子的棋盘上进行,初始时棋子位于左上角,终点为右下角,棋盘上每个格子内有一个0到9的数字,每次棋子可以往右方或下方的相邻格子移动,求一条经 ...

  4. 转-Android中自动连接到指定SSID的Wi-Fi

    最近在做一个项目,其中涉及到一块“自动连接已存在的wifi热点”的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏些许错误造成功能无法 ...

  5. Spring3.2.2之后不赞成使用queryForInt

    原来: public int getMatchCount(String username,String password){ String sql="select count(*) from ...

  6. ubuntu安装spark on yarn

    安装spark 安装hadoop 安装ssh,调试免密钥登录 配置hadoop 配置yarn 测试

  7. HD1847 Good Luck in CET-4 Everybody!(巴什博弈)

    巴什博弈: 一堆物品n个,最多取m个,最少取1个,最后取走的人获胜 分析:只要保证取玩最后剩m+1个,则必定胜利,所以构造m+1,只要n是 m+1的倍数,则先手必败,每次先手取玩,后手可取使得剩下的仍 ...

  8. tomcat7禁用catalina.out输出

    tomcat7中禁用catalina.out的输出,又可能很大. 直接修改catalina.sh文件的输出语句. 在文件中找到以下内容. if [ -z "$CATALINA_OUT&quo ...

  9. App接口简介

  10. --hdu 1231 最大连续子序列(动态规划)

    AC code: #include<stdio.h> int a[100005]; int main(void) { int n,i; int sum,maxn,tem,s,e,flag; ...