共用方式為


xp_cmdshell (Transact-SQL)

繁衍 Windows 命令 Shell 並傳入字串中以供執行。任何輸出都會當作文字資料列來傳回。

主題連結圖示Transact-SQL 語法慣例

語法

xp_cmdshell { 'command_string' } [ , no_output ]

引數

  • 'command_string'
    這是包含要傳送至作業系統之命令的字串。command_stringvarchar(8000)nvarchar(4000),沒有預設值。command_string 不能包含多組雙引號。如果檔案路徑或 command_string 參考的程式名稱中有任何空格,則需使用單引號配對。如果使用內嵌空格會出錯,請考慮改用 FAT 8.3 檔案名稱作為因應措施。
  • no_output
    這是選擇性參數,用來指定不應將輸出傳回用戶端。

傳回碼值

0 (成功) 或 1 (失敗)

結果集

執行下列 xp_cmdshell 陳述式會傳回目前目錄的目錄清單。

EXEC xp_cmdshell 'dir *.exe';
GO

資料列會傳回在 nvarchar(255) 資料行中。如果使用了 no_output 選項,則只傳回下行:

The command(s) completed successfully.

備註

xp_cmdshell 繁衍的 Windows 處理序擁有與 SQL Server 服務帳戶相同的安全性權限。

xp_cmdshell 會同步操作。完成 command-shell 命令時,才會將控制權傳回呼叫者。

您可以利用介面區組態工具及執行 sp_configure 來啟用及停用 xp_cmdshell。如需詳細資訊,請參閱<介面區組態>和<xp_cmdshell 選項>。

ms175046.note(zh-tw,SQL.90).gif重要事項:
如果 xp_cmdshell 是在批次內執行,且傳回錯誤,則批次會失敗。這是行為的變更。在舊版 Microsoft SQL Server 中,批次仍可繼續執行。

xp_cmdshell Proxy 帳戶

當它被一個不屬於系統管理員 (sysadmin) 固定伺服器角色的成員呼叫時,xp_cmdshell 會利用儲存在命名為 ##xp_cmdshell_proxy_account## 之認證中的帳戶名稱和密碼來連接到 Windows。如果這個 Proxy 認證不存在,xp_cmdshell 便會失敗。

您可以執行 sp_xp_cmdshell_proxy_account 來建立 Proxy 帳戶認證。作為引數,這個預存程序會取得 Windows 使用者名稱和密碼。例如,下列命令會針對 Windows 網域使用者 SHIPPING\KobeR (這個使用者有 Windows 密碼 sdfh%dkc93vcMt0) 來建立 Proxy 認證。

EXEC sp_xp_cmdshell_proxy_account 'SHIPPING\KobeR','sdfh%dkc93vcMt0'

如需詳細資訊,請參閱<sp_xp_cmdshell_proxy_account (Transact-SQL)>。

權限

需要 CONTROL SERVER 權限。

範例

A. 傳回可執行檔清單

下列範例會顯示執行目錄命令的 xp_cmdshell 擴充預存程序。

EXEC master..xp_cmdshell 'dir *.exe'

B. 使用 Windows net 命令

下列範例會顯示如何在預存程序中使用 xp_cmdshell。這個範例利用 net send 來通知使用者即將關閉 SQL Server 的執行個體,利用 net pause 來暫停伺服器,然後利用 net stop 來關閉伺服器。

CREATE PROC shutdown10
AS
    EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server 
        shutting down in 10 minutes. No more connections 
        allowed.', no_output
    EXEC xp_cmdshell 'net pause sqlserver'
    WAITFOR DELAY '00:05:00'
    EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server 
        shutting down in 5 minutes.', no_output
    WAITFOR DELAY '00:04:00'
    EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server 
        shutting down in 1 minute. Log off now.', no_output
    WAITFOR DELAY '00:01:00'
    EXEC xp_cmdshell 'net stop sqlserver', no_output

C. 未傳回輸出

下列範例會利用 xp_cmdshell 執行命令字串,但不將輸出傳回用戶端。

USE master;
EXEC xp_cmdshell 'copy c:\SQLbcks\AdvWorks.bck
    \\server2\backups\SQLbcks, NO_OUTPUT';
GO

D. 使用傳回狀態

在下列範例中,xp_cmdshell 擴充預存程序也建議傳回狀態。傳回碼值儲存在變數 @result 中。

DECLARE @result int
EXEC @result = xp_cmdshell 'dir *.exe'
IF (@result = 0)
   PRINT 'Success'
ELSE
   PRINT 'Failure'

E. 將變數內容寫入檔案

下列範例將 @var 變數的內容寫入目前伺服器目錄中一個命名為 var_out.txt 的檔案。

DECLARE @cmd sysname, @var sysname
SET @var = 'Hello world'
SET @cmd = 'echo ' + @var + ' > var_out.txt'
EXEC master..xp_cmdshell @cmd

F. 將命令結果擷取至檔案

下列範例會將目前目錄的內容寫入目前伺服器目錄中一個名稱為 dir_out.txt 的檔案。

DECLARE @cmd sysname, @var sysname
SET @var = 'dir/p'
SET @cmd = @var + ' > dir_out.txt'
EXEC master..xp_cmdshell @cmd

請參閱

參考

一般擴充預存程序 (Transact-SQL)
sp_xp_cmdshell_proxy_account (Transact-SQL)

其他資源

xp_cmdshell 選項
介面區組態

說明及資訊

取得 SQL Server 2005 協助