(转)使用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

[sql] view plaincopyprint?

  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

[sql] view plaincopyprint?

  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

[sql] view plaincopyprint?

  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

[sql] view plaincopyprint?

  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

[sql] view plaincopyprint?

  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:

[plain] view plaincopyprint?

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

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

双击文件可以看到:

在执行前,是没有TestDB:

执行中:

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

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

时间: 2024-08-07 17:18:37

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

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

出处不明 概述: 作为DBA,经常要用开发人员提供的SQL脚本来更新正式数据库,但是一个比较合理的开发流程,当提交脚本给DBA执行的时候,可能已经有几百个sql文件,并且有执行顺序,如我现在工作的公司,十几个客户,每个客户一个库,但是数据库结构.存储过程.视图等都是一模一样,每次执行脚本(以下称为升级),如果有一百个脚本,那么就要按顺序执行过千次,这种工作量可不是一个人能承受得了的. 解决方法: 应对这种情况有以下几种方法: 1.  购买第三方软件(一般估计很少人买) 2.  自己编程一个小软件

使用SQLCMD在SQLServer执行多个脚本

概述: 作为DBA,经常要用开发人员提供的SQL脚本来更新正式数据库,但是一个比较合理的开发流程,当提交脚本给DBA执行的时候,可能已经有几百个sql文件,并且有执行顺序,如我现在工作的公司,十几个客户,每个客户一个库,但是数据库结构.存储过程.视图等都是一模一样,每次执行脚本(以下称为升级),如果有一百个脚本,那么就要按顺序执行过千次,这种工作量可不是一个人能承受得了的. 解决方法: 应对这种情况有以下几种方法: 1.  购买第三方软件(一般估计很少人买) 2.  自己编程一个小软件来执行,但

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

原文:解决 SqlServer执行脚本,文件过大,内存溢出问题 执行.sql脚本文件,如果文件较大时,执行会出现内存溢出问题,可用命令替代 cmd 中输入 osql -S 127.0.0.1,8433 -U sa -P sa -i d:\sql.sql ,-S 服务器名 -U 用户名 -P 密码 -i 文件地址,等待执行完毕即可 以上在sql2008R2下执行通过 如果数据库是 sql2008的 请将 osql 修改成为 sqlcmd 即可

查询SQLSERVER执行过的SQL记录

原文:查询SQLSERVER执行过的SQL记录 有的时候,需要知道SQLSERVER执行了什么语句,可以用下面的方法: SELECT TOP 1000 --创建时间 QS.creation_time, --查询语句 SUBSTRING(ST.text,(QS.statement_start_offset/2)+1, ((CASE QS.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE QS.statement_end_offse

SQLServer执行计划生成方式

说一点关于SQLServer 执行计划相关的东西吧,首先我不是DBA,这几年也做了一些关于SQL优化的东西,有一点自己理解的东西,说的不一定正确. 首先从应用程序传过来的T-SQL语句和存储过程的差异就是传过来的语句SQLServer会进行一次编译,而存储过程则是编译好的,执行时无需再次编译,等于就是一次编译多次执行,而传过来的SQL语句如果不是参数化查询的话不同的条件会生成不同的执行计划,举个栗子:SELECT * FROM dbo.Employee  WHERE ID = 1和 SELECT

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

原文链接:https://www.cnblogs.com/icycore/p/10493237.html 有的时候,需要知道近段时间SQLSERVER执行了什么语句,可以用下面的方法: SELECT TOP 1000 QS.creation_time, SUBSTRING(ST.text, (QS.statement_start_offset / 2) + 1, ((CASE QS.statement_end_offset WHEN - 1 THEN DATALENGTH(st.text) EL

Windows 添加计划任务 每隔一定时间执行指定批处理脚本

schtasks /create /sc minute /mo 20 /tn "TestBatch" /tr C:/TestBatch.bat TestBatch.bat echo "---------------------批处理开始------------------------------"ping sz.tencent.com > D:/a.txtping sz1.tencent.com >> D:a.txtping sz2.tencent

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

RAC安装时需要执行4个脚本 1) $ORACLE_BASE/oraInventory/orainstRoot.sh (clusterware 结束时执行) 2) $CRS_HOME/root.sh (clusterware 结束时执行) 3) $CRS_HOME/bin/vipca.sh(该脚本是在第二个节点执行$CRS_HOME/root.sh时被自动调用) 4) $ORACLE_HOME/root.sh (安装完数据库以后执行) 1. orainstRoot.sh 脚本 1.1 orain

把ps -ef & kill指令写成可以自动执行的shell脚本

之前重启服务器上的服务,均是先使用ps -ef | grep xxx指令查询出PID,然后再使用kill -9 PID指令杀死进程.由于重启的服务只止一个,每次都要重复输入,甚是麻烦. 示例 今天研究了一下,把以上手动查杀.重启服务的过程写成了shell脚本,重启服务只需执行脚本就可以了.附脚本样例: 1 #!/bin/sh 2 3 # restart das-web 4 ps -ef | grep /home/***/das-web/ | awk '{print $2}' | xargs -n