SqlServer2008R2使用SQLCMD执行多个脚本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SqlServer2008R2使用SQLCMD执行多个脚本相关的知识,希望对你有一定的参考价值。

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命令。

1.先创建一个在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

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

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

3.在C盘下直接执行bat文件

执行后,该创建的东西都创建出来了,由于执行的顺序已经在脚本1中定义好,所以直接执行即可,并且执行成功。

以上是关于SqlServer2008R2使用SQLCMD执行多个脚本的主要内容,如果未能解决你的问题,请参考以下文章

SqlServer2008R2执行计划

同一 .bat 文件中的 SQL 安装和 sqlcmd 问题

从命令行执行 SQL 脚本

SQL SERVER 2008R2 执行大脚本文件时,提示“内存不足”的解决办法

SqlServer2008R2索引视图

SqlServer 2008r2备份到共享磁盘