使用SQLCMD在SQLServer执行多个脚本

article/2025/11/10 5:02:40

使用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 plain  copy
 print?
  1. /* SCRIPT: CREATE_DB.sql */  
  2. /* 创建TestDB数据库 */  
  3.   
  4. -- This is the main caller for each script  
  5. SET NOCOUNT ON  
  6. GO  
  7.   
  8. PRINT '开始创建TestDB数据库'  
  9. IF EXISTS (SELECT 1 FROM SYS.DATABASES WHERE NAME = 'TestDB')  
  10. DROP DATABASE TestDB  
  11. GO  
  12. CREATE DATABASE TestDB  
  13. GO  
  14.   
  15. :On Error exit  
  16.   
  17. :r c:\Scripts\CREATE_TABLES.sql  
  18. :r c:\Scripts\TABLE_INSERTS.sql  
  19. :r c:\Scripts\CREATE_INDEXES.sql  
  20. :r c:\Scripts\CREATE_PROCEDURES.sql  
  21.   
  22. PRINT '创建完毕'  
  23. GO  

 

脚本2:CREATE_INDEXES.sql

[sql]  view plain  copy
 print?
  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 plain  copy
 print?
  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.   
  13.     SELECT  *  
  14.     FROM    DBO.EMPLOYEE E  
  15.             JOIN DBO.TIMECARD T ON E.EMPLOYEEID = T.EMPLOYEEID  
  16.     WHERE   E.EMPLOYEEID = @EMPLOYEEID  
  17.     ORDER BY DATEWORKED  
  18.   
  19. GO  


脚本4:CREATE_TABLES.sql

[sql]  view plain  copy
 print?
  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.   
  19. IF OBJECT_ID('TIMECARD') IS NOT NULL   
  20.     DROP TABLE DBO.TIMECARD  
  21. GO  
  22. CREATE TABLE DBO.TIMECARD  
  23.     (  
  24.       TIMECARDID INT IDENTITY(1, 1)  
  25.                      NOT NULL  
  26.                      PRIMARY KEY ,  
  27.       EMPLOYEEID INT NOT NULL ,  
  28.       HOURSWORKED TINYINT NOT NULL ,  
  29.       HOURLYRATE MONEY NOT NULL ,  
  30.       DATEWORKED DATETIME NOT NULL  
  31.     )  
  32. GO  
  33.   
  34. DECLARE @TOTAL_TABLES INT  
  35. SET @TOTAL_TABLES = 2  


脚本5:TABLE_INSERTS.sql

[sql]  view plain  copy
 print?
  1. /* 插入表数据 */  
  2.   
  3. PRINT 'TOTAL TABLES CREATED = ' + CAST(@TOTAL_TABLES AS VARCHAR)  
  4. GO  
  5. PRINT '正在插入数据到表 EMPLOYEE'  
  6. GO  
  7. USE TestDB  
  8. GO  
  9. INSERT  INTO DBO.EMPLOYEE  
  10.         ( FIRSTNAME, LASTNAME )  
  11.         SELECT  'JOHN' ,  
  12.                 'DOE'  
  13. GO  
  14. INSERT  INTO DBO.EMPLOYEE  
  15.         ( FIRSTNAME, LASTNAME )  
  16.         SELECT  'JANE' ,  
  17.                 'DOE'  
  18. GO  
  19. INSERT  INTO DBO.EMPLOYEE  
  20.         ( FIRSTNAME, LASTNAME )  
  21.         SELECT  'JEFF' ,  
  22.                 'DOE'  
  23. GO  


 

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

 

[plain]  view plain  copy
 print?
  1. SQLCMD -E -dmaster -ic:\Scripts\create_db.sql  
  2. PAUSE  

 


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

 

双击文件可以看到:

在执行前,是没有TestDB:

 

执行中:

 

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

 

 

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

 

总结:

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

http://blog.csdn.net/dba_huangzj/article/details/8350829


http://chatgpt.dhexx.cn/article/mLusDISX.shtml

相关文章

sqlcmd命令执行大的SQL脚本

前言 这两天从服务器导出一个150多MB的脚本文件,导入到我本地的SQLServer数据库中时,直接打开执行提示内存不足的错误,于是google搜索发现微软针对此类情况有不少命令行工具,其中有一款sqlcmd 实用工具,官方文档地址为…

sql安装弹出sqlcmd_使用SQL Server命令行(sqlcmd)

sql安装弹出sqlcmd 介绍 (Introduction) Sqlcmd allows executing queries, T-SQL sentences and SQL Server scripts using the command line. Sqlcmd允许使用命令行执行查询,T-SQL语句和SQL Server脚本。 In the previous article How to work with the command…

SQL Server Management Studio 查询中使用 SQLCMD 模式

从 SQL Server 2005 开始,可以在 SQL Server Management Studio 查询编辑器中使用 SQLCMD 模式执行 TSQL。要在查询编辑器中编写或编辑 SQLCMD 脚本,需要启用 SQLCMD 模式。默认情况下,此模式是关闭的。 若要启用 SQLCMD 模式,请单…

sqlcmd去掉表头和X行受影响

使用sql语句导出到文件 sqlcmd -d test01 -U test01 -P test01 -S testdb.database.windows.net -Q "select * from test01" -o "test01.csv" -s "," -W -h-1 -k1 -d:数据库名 -U 用户名 -P 密码 -S 服务器名 -Q 执行查询后退出 -o 输出…

sqlcmd 命令

SQLCMD的介绍 文章转载自:http://blog.sina.com.cn/s/blog_3eec0ced0100mhm2.html 最近经常用到超过80M *.sql文件的导入问题。 上网找了一下,发现超过80M的文件是不能在查询分析器中执行的。 找了些解决方案,个人感觉最简单的方法就是这个…

cmd执行服务器sql文件命令行,Dos命令提示符下 - 用sqlcmd执行*.sql语句

Dos命令提示符下 - 用sqlcmd执行*.sql语句 1)在Dos命令下执行sqlcmd命令(当然事先需要将sqlcmd增加到环境变量中去), 2)下面白色部分替换为服务器名或计算机名即可 sqlcmd -S (local) -U sa -P 123 -d testdb -i C:\temp\data.sql 参数说明:-S 服务器地址 -U 用户名 -P 密码…

sql安装弹出sqlcmd_SQL Server中SQLCMD实用工具概述

sql安装弹出sqlcmd This article is aimed at helping you understand the sqlcmd utility. Of course, this is a tool most of us have used it at several occasions given that the tool has been around for a decade now. However, to be a solid starting point, this a…

SQLServer知识:sqlcmd用法笔记

今天给大家介绍sqlcmd用法笔记,希望对大家能有所帮助! 1、介绍 sqlcmd是一个 Microsoft Win32 命令提示实用工具,可以通过该命令工具实现SQL语句、脚本的执行,并且可以实现脚本任务的自动化。 2、使用场景 2.1 针对大文件脚本的执…

Sqlcmd使用详解

Sqlcmd实用工具,可以输入 TRANSACT-SQL 语句、 系统过程和脚本文件,通过各种可用模式: 通过命令提示符。在中查询编辑器在 SQLCMD 模式下。在 Windows 脚本文件。在 SQL Server 代理作业的操作系统 (Cmd.exe) 作业步骤。 该实用工具使用 OD…

如何在CMD下写SQL语句

1、WinX->搜索环境变量 2、选择环境变量 3、在系统变量中找到Path,并双击进入 4、选择新建 5、选择安装MySQL的盘,找到bin,并复制路径到刚刚新建的Path中,例如笔者安装的盘是D盘 6、把复制好的路径放到Path中 7、WinR->直…

jquery设置cookie、删除cookie、获取cookie

1.引入两个js 去bootcdn搜索就行。 jquery.js <script src"https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>jquery cookie <script src"https://cdn.bootcdn.net/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.js"…

关闭浏览器 清除cookie

根据客户要求使用dedecms v5.6版本&#xff0c;发现了一个会员登录的bug&#xff01;看来dedecms也不过如此&#xff01; 首先说说bug所在&#xff1a;在会员登录页面 /member/index.php 登录的时候 有效期如果选择‘即时’&#xff0c;那么就永远也登不上去了&#xff01; 原因…

删除cookie删不掉的问题

文章转自&#xff1a; https://blog.csdn.net/swimming_in_it_/article/details/80290547 https://blog.csdn.net/huanshiwushuang/article/details/70172536 http://php.js.cn/blog/delete-cookie/ 不知道能不能解决你的问题,但是我来说说我的经历&#xff0c;昨天在用Yii…

Javascript清除所有的cookie

只需一个js函数即可&#xff1a; //清除所有cookie函数function clearAllCookie() {var keys document.cookie.match(/[^ ;](?\)/g);if(keys) {for(var i keys.length; i--;)document.cookie keys[i] 0;expires new Date(0).toUTCString()}} 测试的所有代码如下&#xf…

JS创建、获取、删除 cookie 方法

js 创建 cookie 方法 // 没有设置 cookie 过期时间的话&#xff0c;默认是 会话cookie(浏览器关闭时&#xff0c;该cookie失效&#xff0c;被删除) document.cookie cname "" value; // 设置了过期时间的话&#xff0c;在设置的时间段内 cookie 一直存在有效&…

浏览器cookie怎么清除,彻底清除上网痕迹只需这几步

很多用户对cookie不是很了解&#xff0c;我们使用windows系统电脑浏览各个网站的时候都会产生cookie&#xff0c;cookie记录用户名、密码等信息。显而易见的是&#xff0c;cookie和网络隐私安全息息相关&#xff0c;有些恶意网站会利用cookie来侵犯用户隐私安全。因此清理cooki…

vcruntime140.dll发生访问冲突

0x6EF538DC (vcruntime140.dll)处引发的异常: 0xC0000005: 写入位置0x00000000 时发生访问冲突 发生以上问题&#xff0c;有可能为内存不足引起&#xff0c;可尝试分配更大内存。 在本次报错中&#xff0c;我们将1024*1024*8的BUFFER_SIZE扩大为1024*1024*20&#xff0c;成功解…

电脑提示vcruntime140_1.dll丢失怎么安装?

许多用户在使用电脑的时候&#xff0c;在安装运行某些程序的时候&#xff0c;电脑突然提示由于找不到vcruntime140_1.dll&#xff0c;无法继续执行代码&#xff0c;遇到这种情况我们应该怎么解决呢&#xff1f;下面小编就带着大家一起看看吧&#xff01; 首先是打开电脑浏览器后…

电脑提示vcruntime140_1.dll丢失的正确修复方法

vcruntime140_1.dll是vs2010编译的程序默认的库文件它的丢失易导致游戏、应用软件等程序运行出现错误&#xff0c;致使程序无法正常运行&#xff0c;下面小编教大家电脑提示vcruntime140_1.dll丢失的正确修复教程 首先打开一个360&#xff0c;搜狗等等电脑浏览器&#xff0c;输…

vcruntime140_1.dll缺失

问题&#xff1a;安装mysql-8.0.29执行mysql -install命令出现由于找不到VCRUNTIME140_1.dll&#xff0c;无法继续执行代码。 解决方法&#xff1a;下载VCRUNTIME140_1.dll 把文件放到C:\Windows\System32目录下