從命令行提示窗口中以交互模式啟動sqlcmd命令。當(dāng)在窗口中執(zhí)行SQL查詢時,我們就會即時看到結(jié)果,而相同的查詢操作我們在SQL Server Management Studio的sqlcmd模式可以更簡單地實現(xiàn)。Sqlcmd的真正作用在于它能夠很容易自動執(zhí)行已保存的帶有位置和執(zhí)行方式選項的SQL腳本——選項控制可以通過傳入?yún)?shù)或sqlcmd變更實現(xiàn)。
下面是一組最常用的sqlcmd特性:
1、執(zhí)行腳本文件。在sqlcmd中執(zhí)行腳本文件的方法有2種。在DOS中,可以調(diào)用sqlcmd命令,并用選項-i傳入想要執(zhí)行的文件名:
sqlcmd -i"c:\sql\MySql.sql"
注意:雙引號只在路徑中包含空格時才是必需的,但為了保持一致性,我總是使用雙引號來表示路徑。
第二個方法是從一個執(zhí)行的SQL文件中調(diào)用另一個SQL文件。這可以使我們實現(xiàn)更多層次的腳本文件,其中最上層負責(zé)控制整個流程——指定執(zhí)行的文件和傳入的參數(shù)。下面的腳本將從一個在sqlcmd模式中運行的SQL文件中執(zhí)行MySql.sql文件:
:r "c:\sql\MySql.sql"
2、使用和傳遞變量。在我看來,這是SQL Server 2005的sqlcmd對比于之前的SQL Server版本的osql的最好用的功能。我們可以在sqlcmd腳本內(nèi)使用:server指令聲明變量,然后在后面的代碼中將變量名放在placeholder $()中來使用這些變量。Sqlcmd會用所引用變量的值替換這些占位符。
:setvar hello "Hello World"
PRINT '$(hello)'
如果聲明和定義了一個變量,那么其中會有一個很有用的操作是執(zhí)行上下文其中包括聲明變量的文件所調(diào)用的所有腳本文件。這使我們能將變量從父腳本文件傳遞到子腳本文件。在下面的例子中,變量hello在所調(diào)用的MySql2.sql文件中也是可以使用的。
:setvar hello "Hello World"
:r "c:\sql\MySql2.sql"
如果在DOS中調(diào)用sqlcmd,我們可以傳入?yún)?shù)并使用命令行選項-v來傳遞它們。
sqlcmd -i"c:\sql\MySql2.sql" -
vhello="Hello World"
3、連接到多個服務(wù)器。在啟動sqlcmd時,我們需要連接到一個特定的服務(wù)器來執(zhí)行我們的代碼。但是在SQL中,你可以將連接修改為另一個不同的服務(wù)器,然后接下來的腳本都會在新的服務(wù)器上執(zhí)行。我們可以使用下面的命令來連接另一個服務(wù)器:
:connect MyServer2
SELECT * FROM sys.databases – returns
databases from MyServer2
4、改進錯誤處理。Sqlcmd會有許多選項可用于處理程序所遇到的意外情況。將這個特性與sqlcmd變量相結(jié)合,我們可以很靈活地處理所遇到的意外情況。例如,如果我們想要確定一個特定的腳本文件只會在一個指定的數(shù)據(jù)庫服務(wù)器上執(zhí)行,那么我們需要在代碼中確保它不會出錯。這個例子使用“:on error exit”命令來規(guī)如果SQL Server實例的名稱不是PREHAK,腳本的執(zhí)行就應(yīng)該停止:
:on?error?exit
IF?(@@servername?!=?'RREHAK') BEGIN RAISERROR(N'This?script?can?only Execute?on?RREHAK',?16,?127) END |
任何跟在上面代碼后的腳本都不會執(zhí)行。
5、備份和恢復(fù)一個數(shù)據(jù)庫?,F(xiàn)在我將介紹一個好用的sqlcmd腳本例子。我經(jīng)常會創(chuàng)建腳本來備份一個服務(wù)器上的數(shù)據(jù)庫,然后將它恢復(fù)到另一個服務(wù)器上。通過使用sqlcmd,我們可以在一個腳本里完成這所有的操作,因為我們可以同時連接到源和目標服務(wù)器。下面的腳本會備份一個服務(wù)器上的Northwind數(shù)據(jù)庫,然后再將它恢復(fù)到另一臺服務(wù)器上。
--?connect?to?the?source?server
:CONNECT?rrehak\sql2000 BACKUP?DATABASE?Northwind TO?DISK?=?'C:\Temp\Northwind.bak' WITH?INIT GO --?connect?to?the?destination?server :CONNECT?rrehak --?if?the?database?exists,?disconnect?any possible?connections IF?EXISTS?(SELECT?*?FROM master.dbo.sysdatabases?WHERE?name?= 'Northwind') ALTER?DATABASE?Northwind SET?SINGLE_USER?WITH?ROLLBACK?IMMEDIATE GO RESTORE?DATABASE?[Northwind] FROM?DISK?=?N'C:\Temp\Northwind.bak' WITH?FILE?=?1, MOVE?N'Northwind'?TO?N'C:\SQL?Server Databases\Northwind.mdf', MOVE?N'Northwind_log'?TO?N'C:\SQL?Server Databases\Northwind_1.ldf', NOUNLOAD,?STATS?=?10 GO |
這個腳本作了進一步的改進,它向我們演示了如何在sqlcmd上執(zhí)行操作系統(tǒng)的命令。演示腳本從源數(shù)據(jù)庫所備份的位置恢復(fù)數(shù)據(jù)庫。假設(shè)我們要拷貝一個備份文件到目標服務(wù)器的一個文件夾,因為我們將重復(fù)地恢復(fù)這個文件,這樣做可以避免通過網(wǎng)絡(luò)來恢復(fù)。Sqlcmd可以使用指令:!!來執(zhí)行DOS命令。這樣,將下面的腳本放在備份部分代碼之后而在恢復(fù)部分代碼之前,就可以執(zhí)行DOS拷貝命令來創(chuàng)建備份文件的一個拷貝了:
:setvar?CopyCommand?"copy
\?\sqlserver1\c$\Temp\Northwind.bak \?\sqlserver2\c$\sql" :!!?$(CopyCommand) |
所有這些特性使得sqlcmd成為自動化SQL Server管理和維護的工具。例如,我們可以創(chuàng)建一個“worker”腳本文件,它包含一套通用的腳本,它們需要在多個數(shù)據(jù)庫、甚至多個服務(wù)器上執(zhí)行。在這些腳本中我們將使用sqlcmd變量:
本文概述了使用sqlcmd工具的方法和實例。你可以在Microsoft Books Online上閱讀更多關(guān)于sqlcmd的文章,然后開始創(chuàng)建你自己的一套腳本,來自動化你的重復(fù)性任務(wù),從而提高你的工作效率。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
