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

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