`
sjk2013
  • 浏览: 2185593 次
文章分类
社区版块
存档分类
最新评论

使用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
GO

PRINT '开始创建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.sql

PRINT '创建完毕'
GO

脚本2:CREATE_INDEXES.sql

/* 创建索引 */
PRINT '开始创建索引'
GO
USE TestDB
GO
IF NOT EXISTS ( SELECT  1
                FROM    SYS.INDEXES
                WHERE   NAME = 'IX_EMPLOYEE_LASTNAME' ) 
    CREATE INDEX IX_EMPLOYEE_LASTNAME ON DBO.EMPLOYEE(LASTNAME, FIRSTNAME)
GO
IF NOT EXISTS ( SELECT  1
                FROM    SYS.INDEXES
                WHERE   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 ON

    SELECT  *
    FROM    DBO.EMPLOYEE E
            JOIN DBO.TIMECARD T ON E.EMPLOYEEID = T.EMPLOYEEID
    WHERE   E.EMPLOYEEID = @EMPLOYEEID
    ORDER BY DATEWORKED

GO


脚本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 NULL
                     PRIMARY KEY ,
      FIRSTNAME VARCHAR(50) ,
      LASTNAME VARCHAR(50)
    )
GO

IF OBJECT_ID('TIMECARD') IS NOT NULL 
    DROP TABLE DBO.TIMECARD
GO
CREATE TABLE DBO.TIMECARD
    (
      TIMECARDID INT IDENTITY(1, 1)
                     NOT NULL
                     PRIMARY KEY ,
      EMPLOYEEID INT NOT NULL ,
      HOURSWORKED TINYINT NOT NULL ,
      HOURLYRATE MONEY NOT NULL ,
      DATEWORKED DATETIME NOT NULL
    )
GO

DECLARE @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在SQL Server执行多个脚本

    但是数据库结构、存储过程、视图等都是一模一样,每次执行脚本(以下称为升级),如果有一百个脚本,那么要按顺序执行过千次,这种工作量可不是一个人能承受得了的。  解决方法:  应对这种情况有以下几种方法...

    SQL脚本批量执行脚本

    (1) 使用前需确保已将sqlcmd加入到系统环境变量中。 (2) 如果您没有该SQL Server服务器的Windows账户权限,需手动更改脚本中的Sql参数,配置相应的SQL用户名和密码即可。 压缩包里有: 1) BAT脚本 2) 3个SQL脚本...

    SQLServer按顺序执行多个脚本的方法(sqlcmd实用工具使用方法)

    3、使用本文介绍的方法,至于是啥,接着看:使用SQLCMD在SQLServer上执行多个脚本:SQLCMD:使用 sqlcmd 实用工具,可以在命令提示符处、在 SQLCMD 模式下的“查询编辑器”中、在 Windows 脚本文件中或者在 SQL ...

    Microsoft SQL Server 2005开发指南

    书中的一些示例和提示详细介绍了如何将SQL Server 2005作为一个多层的数据库平台与Visual Studio 2005一起使用,如何使用SQL CMD创建自定义的管理脚本,以及如何使用SQL Profiler提高性能。. 本书主要内容: ·使用 ...

    SQL SERVER数据库批量更新程序 1.0.0.30

    1.批量对多个sql server数据库执行查询或者更新操作。 2.支持将记录集导入为txt、xml以及wps excel或者office excel文件中,对超过65536行的查询结果集自动拆分工作表。 3.支持查询结果在水晶报表工具简单展示。 4....

    Microsoft SQL Server 2005 Express Edition SP3

    sqlcmd -S Server\Instance 其中 Server 是计算机名称,Instance 是要连接到的实例名称。如果已在安装过程中使用了默认的命名实例,则将实例指定为“SQLExpress”。 [顶部] 2.3 管理 SQL Server Express 的工具 ...

    SQL Server 2008管理员必备指南(超高清PDF)Part3

    1.5.2 SQLCMD 1.5.3 其他命令行工具 1.6 使用SQL Server PowerShell 1.6.1 运行和使用cmdlet 1.6.2 运行和使用SQL Server PowerShell 1.6.3 使用SQL Server cmdlet 第2章 部署SQL Server 2008 2.1 SQL Server集成...

    SQL Server 2008管理员必备指南(超高清PDF)Part1

    1.5.2 SQLCMD 1.5.3 其他命令行工具 1.6 使用SQL Server PowerShell 1.6.1 运行和使用cmdlet 1.6.2 运行和使用SQL Server PowerShell 1.6.3 使用SQL Server cmdlet 第2章 部署SQL Server 2008 2.1 SQL Server集成...

    SQL Server 2008管理员必备指南(超高清PDF)Part2

    1.5.2 SQLCMD 1.5.3 其他命令行工具 1.6 使用SQL Server PowerShell 1.6.1 运行和使用cmdlet 1.6.2 运行和使用SQL Server PowerShell 1.6.3 使用SQL Server cmdlet 第2章 部署SQL Server 2008 2.1 SQL Server集成...

    SQL Server 2008高级程序设计 4/6

     本书首先介绍SQL Server 2008的新功能,然后在更详实的示例代码的引导下全面深入地展开论述,讨论了如何编写复杂查询、构建各种数据结构以及提高应用程序性能,还讲述了如何管理高级脚本和数据库以及如何确定和...

    SQL Server 2008编程入门经典(第3版)

    第1章 RDBMS基础:SQLServer数据库的构成 1.1 数据库对象概述 1.1.1 数据库对象 1.1.2 事务日志 1.1.3 最基本的数据库对象:表 1.1.4 文件组 1.1.5 数据库关系图 1.1.6 视图 1.1.7 存储过程 1.1.8 用户自定义函数 ...

    SQL Server 2008高级程序设计 2/6

     本书首先介绍SQL Server 2008的新功能,然后在更详实的示例代码的引导下全面深入地展开论述,讨论了如何编写复杂查询、构建各种数据结构以及提高应用程序性能,还讲述了如何管理高级脚本和数据库以及如何确定和...

    SQL.Server.2008管理员必备指南.part2.rar(2/4)

     1.5.2 SQLCMD 15  1.5.3 其他命令行工具 17  1.6 使用SQL Server PowerShell 18  1.6.1 运行和使用cmdlet 18  1.6.2 运行和使用SQL Server PowerShell 19  1.6.3 使用SQL Server cmdlet 20  第2章 部署SQL ...

    SQL.Server.2008管理员必备指南.part1.rar(1/4)

     1.5.2 SQLCMD 15  1.5.3 其他命令行工具 17  1.6 使用SQL Server PowerShell 18  1.6.1 运行和使用cmdlet 18  1.6.2 运行和使用SQL Server PowerShell 19  1.6.3 使用SQL Server cmdlet 20  第2章 部署SQL ...

    microsoft sql server2005以及安装脚本,免序列号,附安装脚本 脚本解决了网友们遇到的安装错误问题

    当年安装部署时,还会出现错误,这个错误至今还很多网友在问。当时我写了个小脚本去解决它。亲测有效。感兴趣的网友可以下载安装。里面也有安装指引,需要修改安装脚本里的路径。请参考“安装前看.txt”,以及...

    SQL.Server.2008管理员必备指南.part4.rar(4/4)

     1.5.2 SQLCMD 15  1.5.3 其他命令行工具 17  1.6 使用SQL Server PowerShell 18  1.6.1 运行和使用cmdlet 18  1.6.2 运行和使用SQL Server PowerShell 19  1.6.3 使用SQL Server cmdlet 20  第2章 部署SQL ...

    SQL.Server.2008编程入门经典(第3版).part2.rar

    第1章 RDBMS基础:SQLServer数据库的构成 1.1 数据库对象概述 1.1.1 数据库对象 1.1.2 事务日志 1.1.3 最基本的数据库对象:表 1.1.4 文件组 1.1.5 数据库关系图 1.1.6 视图 1.1.7 存储过程 1.1.8 用户自定义函数 ...

    SQL.Server.2008编程入门经典(第3版).part1.rar

    第1章 RDBMS基础:SQLServer数据库的构成 1.1 数据库对象概述 1.1.1 数据库对象 1.1.2 事务日志 1.1.3 最基本的数据库对象:表 1.1.4 文件组 1.1.5 数据库关系图 1.1.6 视图 1.1.7 存储过程 1.1.8 用户自定义函数 ...

    SQL.Server.2008管理员必备指南.part3.rar(3/4)

     1.5.2 SQLCMD 15  1.5.3 其他命令行工具 17  1.6 使用SQL Server PowerShell 18  1.6.1 运行和使用cmdlet 18  1.6.2 运行和使用SQL Server PowerShell 19  1.6.3 使用SQL Server cmdlet 20  第2章 部署SQL ...

Global site tag (gtag.js) - Google Analytics