出处不明

概述:

作为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. 查看oracle数据库下面的所有的表,执行某个sql脚本:

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

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

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

  7. C#和Java中执行SQL文件脚本的代码(非常有用)

    原文:C#和Java中执行SQL文件脚本的代码(非常有用) 我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析 去 ...

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

    我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情.按下开机键或启动一个虚拟机,你就启动了一系列事件,之后会进入到一个功能完备的系统中,有时,这个过程不到一分钟.当你注销或者关机时 ...

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

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

随机推荐

  1. 一个小时快速搭建微信小程序

    「小程序」这个划时代的产品发布快一周了,互联网技术人都在摩拳擦掌,跃跃欲试.可是小程序目前还在内测,首批只发放了 200 个内测资格(泪流满面).本以为没有 AppID 这个月就与小程序无缘了,庆幸的 ...

  2. 4.请求方式为application/json时的接口测试要如何做?

    1.单独新建一个线程组, 在信息头管理器中增加: 在Body Data中,添加json格式的内容(我不会写,直接用fiddler抓包,然后把TextView中的数据复制过来). 2.然后因为登录状态, ...

  3. TI公司与MSP430单片机

    美国德州仪器(Texas Instruments)公司,简称TI,是全球领先的半导体公司,成立于1930 年,成立之初是一家使用地震信号处理技术勘探原油的地质勘探公司,1951年更名为德州仪器公司,1 ...

  4. hadoop MapReduce - 从作业、任务(task)、管理员角度调优

    Hadoop为用户作业提供了多种可配置的参数,以允许用户根据作业特点调整这些参数值使作业运行效率达到最优. 一 应用程序编写规范 1.设置Combiner         对于一大批MapReduce ...

  5. 12款免费与开源的NoSQL数据库

    Naresh Kumar是位软件工程师与热情的博主,对于编程与新事物拥有极大的兴趣,非常乐于与其他开发者和程序员分享技术上的研究成果.近日,Naresh撰文谈到了12款知名的免费.开源NoSQL数据库 ...

  6. ZOJ 1655 FZU 1125 Transport Goods

    迪杰斯特拉最短路径. 1.every city must wait till all the goods arrive, and then transport the arriving goods t ...

  7. win32api大全

    win32api大全 http://files.cnblogs.com/files/landv/Win32API%E5%A4%A7%E5%85%A8.zip

  8. 《JS正则表达式》

    1.精通 JS正则表达式: http://www.cnblogs.com/aaronjs/archive/2012/06/30/2570970.html 2.js常用正则表达式: http://www ...

  9. 《JS权威指南学习总结--8.4 作为值的函数》

    内容要点:   函数可以定义,也可以调用,这是函数最重要的特性.函数定义和调用是JS的词法特性,对于其他大多数编程语言来说也是如此.然而在JS中,函数不仅仅是一种语法,也是值,也就是说,可以将函数赋值 ...

  10. Udemy - Angular 2 - The Complete Guide 笔记

    1. install > npm install -g angular-cli 2. create app > ng new first-app 3. build app > cd ...