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

2023年 4月 18日 39.8k 0

解决方法: 应对这种情况有以下几种方法: 1、购买第三方软件(一般估计很少人买) 2、自己编程一个小软件来执行,但是这个逻辑性要求比较高,而且编程的能力要有一定层次,这

解决方法:应对这种情况有以下几种方法: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 scriptSET NOCOUNT ONGO

PRINT '开始创建TestDB数据库'IF EXISTS (SELECT 1 FROM SYS.DATABASES WHERE NAME = 'TestDB')DROP DATABASE TestDBGOCREATE DATABASE TestDBGO

: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 '开始创建索引'GOUSE TestDBGOIF NOT EXISTS ( SELECT  1  FROM    SYS.INDEXES  WHERE   NAME = 'IX_EMPLOYEE_LASTNAME' )     CREATE INDEX IX_EMPLOYEE_LASTNAME ON DBO.EMPLOYEE(LASTNAME, FIRSTNAME)GOIF 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 '正在创建存储过程'GOUSE TestDBGOIF OBJECT_ID('GET_EMPLOYEE_TIMECARDS') IS NOT NULL     DROP PROCEDURE DBO.GET_EMPLOYEE_TIMECARDSGOCREATE PROCEDURE DBO.GET_EMPLOYEE_TIMECARDS @EMPLOYEEID INTAS     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 '正在创建数据表 'GOUSE TestDBGOIF OBJECT_ID('EMPLOYEE') IS NOT NULL     DROP TABLE DBO.EMPLOYEEGOCREATE TABLE DBO.EMPLOYEE    (EMPLOYEEID INT IDENTITY(1, 1)NOT NULLPRIMARY KEY ,FIRSTNAME VARCHAR(50) ,LASTNAME VARCHAR(50)    )GO

IF OBJECT_ID('TIMECARD') IS NOT NULL     DROP TABLE DBO.TIMECARDGOCREATE 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    )GO

DECLARE @TOTAL_TABLES INTSET @TOTAL_TABLES = 2

脚本5:TABLE_INSERTS.sql

复制代码 代码如下:/* 插入表数据 */

PRINT 'TOTAL TABLES CREATED = ' + CAST(@TOTAL_TABLES AS VARCHAR)GOPRINT '正在插入数据到表 EMPLOYEE'GOUSE TestDBGOINSERT  INTO DBO.EMPLOYEE ( FIRSTNAME, LASTNAME ) SELECT  'JOHN' ,  'DOE'GOINSERT  INTO DBO.EMPLOYEE ( FIRSTNAME, LASTNAME ) SELECT  'JANE' ,  'DOE'GOINSERT  INTO DBO.EMPLOYEE ( FIRSTNAME, LASTNAME ) SELECT  'JEFF' ,  'DOE'GO

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

双击文件可以看到:在执行前,是没有TestDB:

 

执行中:

 

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

 

 

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

总结:

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

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论