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

解决方法:

应对这种情况有以下几种方法:

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:

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

执行中:

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

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

总结:

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

(0)

相关推荐

  • .Net下执行sqlcmd的方法

    如下代码: 被的调用方法: 复制代码 代码如下: public static string ExeCommand(string commandText) { Process p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardInput = true; p.StartInfo.RedirectStanda

  • SQLServer2005中的SQLCMD工具使用

    1.你可以用SQLCMD执行交互式动作,如: C:sqlcmd>sqlcmd 1> SELECT name from sys.databases 2> GO 你也可以试着键入如下命令,现实服务器列表 1>:ServerList SERVERS: WUYZ 1>如果想看其他命令的使用,可以键入:Help /? 2.执行SQL脚本文件 你可以在SQLCMD命令上加入参数I来执行SQL脚本文件,例如: C:sqlcmd>sqlcmd -i test.sql 上面的I选项允许你

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

    解决方法: 应对这种情况有以下几种方法: 1.购买第三方软件(一般估计很少人买) 2.自己编程一个小软件来执行,但是这个逻辑性要求比较高,而且编程的能力要有一定层次,这个我暂时没有. 3.使用本文介绍的方法,至于是啥,接着看: 使用SQLCMD在SQLServer上执行多个脚本: SQLCMD:使用 sqlcmd 实用工具,可以在命令提示符处.在 SQLCMD 模式下的"查询编辑器"中.在 Windows 脚本文件中或者在 SQL Server 代理作业的操作系统 (Cmd.exe)

  • headjs实现网站并行加载但顺序执行JS

    http://headjs.com/ 并行加载JS,但是执行的时候却按顺序执行,提高网站速度 <script src="js/head.min.js"></script> <script type="text/javascript"> head.js("js/jquery-1.6.1.min.js","js/jquery.validate.min.js","js/my_valida

  • SQLServer 2000定时执行SQL语句

    我不知道存储过程等能否实现,但是SQL Server 2000的作业调度确实有这样的功能,怎样使某些SQL语句定时执行呢,依次进行下面的操作: 企业管理器 --管理 --SQL Server代理 --右键作业 --新建作业 --"常规"项中输入作业名称 --"步骤"项 --新建 --"步骤名"中输入步骤名 --"类型"中选择"Transact-SQL 脚本(TSQL)" --"数据库"选

  • Java中类的加载顺序执行结果

    具体代码如下所示: public class Parent { public static int a = parentStaticMethod2(); { System.out.println("父类非静态初始化块"); } static { System.out.println("父类静态初始化块"); } public Parent() { System.out.println("父类的构造方法"); } public static int

  • crontab实现每隔多少天执行一次脚本的两种方法

    前言 我们大家在工作中,经常会碰到每隔多少天/小时/分钟执行一次脚本,或某个命令的情况.如果是每隔多少小时,多少分运行一次程序,在crontab中可能比较好实现一些,下面是一些示例及crontab的格式说明: 具体示例: # 下午6点到早上6点,每隔15分钟执行一次脚本 0,15,30,45 18-06 * * * /bin/bash $HOME/script.sh > /dev/null 2>&1 # 每两小时,重启一次服务 * */2 * * * /etc/init.d/apach

  • jquery中的ajax如何返回结果而非回调方式即为同顺序执行

    因为默认ajax是异步的,也就是在未响应到结果时不影响向下的执行.所以必须采用回调的方式来实现.这种方案效率更高. 如果非要返回结果的话,将ajax 中的参数 async 改为 false,即为同顺序执行,如下实现,即可返回到结果. 不过在非必要的情况下,不推荐此种做法 复制代码 代码如下: function(url,params){ var outdata; $.ajax({ type : "get", async:false, dataType:"json",

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

    我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情.按下开机键或启动一个虚拟机,你就启动了一系列事件,之后会进入到一个功能完备的系统中,有时,这个过程不到一分钟.当你注销或者关机时,也是这样. 更有意思的是,在系统启动以及用户登录或注销时,还可以让系统执行特定的操作. 本文,我们将探讨一下在 Linux 操作系统中实现这些目标的传统方法. 注意:我们假定使用的是 Bash 作为登录及注销的主 Shell.如果你使用的是其他 Shell,那么有些方法可能会无效.如果有其他的疑问

  • 微信小程序promsie.all和promise顺序执行

    微信小程序promsie.all和promise顺序执行 一.前言 最近在做小程序的开发,碰到的一个需求就是表单提交,提交的表单中包含有图片,微信这边的做法是先上传图片,后台把图片名称和地址返回给你,然后你把图片信息插入到表单的相应位置再提交表单,这里就涉及到如何上传完图片的请求再上传表单,而且微信小程序里面如果图片是多个的话,也只能一张张上传.简单来说就是上传完图片(多个请求),拿到返回值,再上传表单,该如何做? 二.Promise.all和Promise.race 先来介绍Promise.a

  • 命令行执行php脚本中的$argv和$argc配置方法

    在实际工作中有可能会碰到需要在nginx命令行执行php脚本的时候,当然你可以去配置一个conf用外网访问. 在nginx命令行中 使用 php index.php 就可以执行这个index.php脚本了,但是怎么传递参数呢?那就要用到$argv和$aegc了.不用开启什么设置 直接在脚本中使用,类似于http传值中的$_POST和$_GET.. 在index.php插入以下菜吗 <?php echo $argv[0]; echo "\n"; var_dump($argv[1])

  • 详解如何构建Promise队列实现异步函数顺序执行

    场景 有a.b.c三个异步任务,要求必须先执行a,再执行b,最后执行c 且下一次任务必须要拿到上一次任务执行的结果,才能做操作 思路 我们需要实现一个队列,将这些异步函数添加进队列并且管理它们的执行,队列具有First In First Out的特性,也就是先添加进去的会被先执行,接着才会执行下一个(注意跟栈作区别) 大家也可以类比一下jQuery的animate方法,添加多个动画也会按顺序执行 解决 模拟3个异步函数 // 异步函数a var a = function () { return

随机推荐