使用SQLCMD在SQLServer執行多個指令碼

2022-07-16 07:12:18 字數 4800 閱讀 8141

作為dba,經常要用開發人員提供的sql指令碼來更新正式資料庫,但是乙個比較合理的開發流程,當提交指令碼給dba執行的時候,可能已經有幾百個sql檔案,並且有執行順序,如我現在工作的公司,十幾個客戶,每個客戶乙個庫,但是資料庫結構、儲存過程、檢視等都是一模一樣,每次執行指令碼(以下稱為公升級),如果有一百個指令碼,那麼就要按順序執行過千次,這種工作量可不是乙個人能承受得了的。

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:create_db.sql

[sql]view plain

copy

print

?/* 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

[sql]view plain

copy

print

?/* 建立索引 */  

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

[sql]view plain

copy

print

?/* 建立儲存過程 */  

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

[sql]view plain

copy

print

?/* 建立資料表 */  

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

[sql]view plain

copy

print

?/* 插入表資料 */  

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  

[plain]view plain

copy

print

?sqlcmd -e -dmaster -ic:\scripts\create_db.sql  

pause  

雙擊檔案可以看到:

在執行前,是沒有testdb:

執行中:

執行後,該建立的東西都建立出來了:

由於執行的順序已經在指令碼1中定義好,所以直接執行即可,並且執行成功。

根據個人經驗,還是開發乙個批量執行工具會比較好,這個方法在少量指令碼的時候可以選用。

使用SQLCMD在SQLServer執行多個指令碼

作為dba,經常要用開發人員提供的sql指令碼來更新正式資料庫,但是乙個比較合理的開發流程,當提交指令碼給dba執行的時候,可能已經有幾百個sql檔案,並且有執行順序,如我現在工作的公司,十幾個客戶,每個客戶乙個庫,但是資料庫結構 儲存過程 檢視等都是一模一樣,每次執行指令碼 以下稱為公升級 如果有...

使用sqlcmd命令

今天剛知道ms sql 2005自帶sqlcmd命令,可以在命令列下操作sql server。用法 sqlcmd u 登入 id p 密碼 s 伺服器 h 主機名 e 可信連線 d 使用資料庫名稱 l 登入超時值 t 查詢超時值 h 標題 s 列分隔符 w 螢幕寬度 a 資料報大小 e 回顯輸入 i...

Sqlcmd使用 備查

今天學了下 sqlcmd 的簡單使用方法,這個工具是安裝 sqlserver 後附帶的乙個命令列查詢工具,sqlserver2005 express 下的目錄 c program files microsoft sql server 90 tools binn sqlcmd.exe 直接雙擊執行,就...