使用 Invoke-Sqlcmd 指令程式
Invoke-Sqlcmd 是一種執行指令碼的 SQL Server 指令程式,該指令碼包含了 sqlcmd 公用程式支援之語言 (Transact-SQL 和 XQuery) 和命令的陳述式。
使用 Invoke-Sqlcmd
Invoke-Sqlcmd 指令程式可讓您在 Windows PowerShell 環境中執行 sqlcmd 指令碼檔案。sqlcmd 可以執行的大多數作業也可以使用 Invoke-Sqlcmd 來執行。
這是呼叫 Invoke-Sqlcmd 來執行簡單查詢的範例,類似於指定 sqlcmd 及 -Q 和 -S 選項:
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
這是呼叫 Invoke-Sqlcmd 的範例,指定輸入檔並將輸出傳送到檔案中。這類似於指定 sqlcmd 及 -i 和 -o 選項:
Invoke-Sqlcmd -InputFile "C:\MyFolder\TestSQLCmd.sql" | Out-File -filePath "C:\MyFolder\TestSQLCmd.rpt"
這是使用 Windows PowerShell 陣列將多個 sqlcmd 指令碼變數傳給 Invoke-Sqlcmd 的範例。用於識別 SELECT 陳述式中 sqlcmd 指令碼變數的 "$" 字元已經使用 Windows PowerShell 反勾號 "`" 逸出字元逸出:
$MyArray = "MyVar1 = 'String1'", "MyVar2 = 'String2'"
Invoke-Sqlcmd -Query "SELECT `$(MyVar1) AS Var1, `$(MyVar2) AS Var2;" -Variable $MyArray
這是使用 SQL Server 提供者導覽至 Database Engine 執行個體,然後使用 Windows PowerShell Get-Item 指令程式擷取此執行個體的 SMO Server 物件並將它傳遞給 Invoke-Sqlcmd 的範例:
Set-Location SQLSERVER:\SQL\MyComputer\MyInstance
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance (Get-Item .)
-Query 參數是位置性參數而且不需要加以命名。如果傳遞給 Invoke-Sqlcmd 的第一個字串未命名,它就會被視為 -Query 參數。
Invoke-Sqlcmd "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
Invoke-Sqlcmd 中的路徑內容
如果您沒有使用 -Database 參數,Invoke-Sqlcmd 的資料庫內容就會由呼叫此指令程式時作用中的路徑所設定。
路徑 |
資料庫內容 |
---|---|
以磁碟機而非 SQLSERVER: 為開頭 |
本機電腦上預設執行個體中登入識別碼的預設資料庫。 |
SQLSERVER:\SQL |
本機電腦上預設執行個體中登入識別碼的預設資料庫。 |
SQLSERVER:\SQL\ComputerName |
指定之電腦上預設執行個體中登入識別碼的預設資料庫。 |
SQLSERVER:\SQL\ComputerName\InstanceName |
指定之電腦上指定執行個體中登入識別碼的預設資料庫。 |
SQLSERVER:\SQL\ComputerName\InstanceName\Databases |
指定之電腦上指定執行個體中登入識別碼的預設資料庫。 |
SQLSERVER:\SQL\ComputerName\InstanceName\Databases\DatabaseName |
指定之電腦上指定執行個體中指定的資料庫。這也適用於較長的路徑,例如指定資料庫內部之 Tables 和 Columns 節點的路徑。 |
例如,假設在本機電腦的預設執行個體中,Windows 帳戶的預設資料庫是 master。然後,下列命令就會傳回 master:
Set-Location SQLSERVER:\SQL
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"
下列命令則傳回 AdventureWorks:
Set-Location SQLSERVER:\SQL\MyComputer\DEFAULT\Databases\AdventureWorks\Tables\Person.Contact
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"
當 Invoke-Sqlcmd 使用路徑資料庫內容時,它會提供警告。您可以使用 -SuppressProviderContextWarning 參數來關閉警告訊息。您可以使用 -IgnoreProviderContext 參數來告知 Invoke-Sqlcmd 一律使用預設資料庫進行登入。
比較 Invoke-Sqlcmd 和 sqlcmd 公用程式
Invoke-Sqlcmd 可用於執行可以使用 sqlcmd 公用程式執行的許多指令碼。但是,Invoke-Sqlcmd 執行所在的 Windows PowerShell 環境與 sqlcmd 執行所在的命令提示字元環境不同。Invoke-Sqlcmd 的行為已經過修改,可在 Windows PowerShell 環境中工作。
並非所有的 sqlcmd 命令都會在 Invoke-Sqlcmd 中實作。未實作的命令包含以下項目::!!、:connect、:error、:out、:ed、:list、:listvar、:reset、:perftrace 和 :serverlist。
Invoke-Sqlcmd 不會初始化 sqlcmd 環境或指令碼變數,例如 SQLCMDDBNAME 或 SQLCMDWORKSTATION。
Invoke-Sqlcmd 不會顯示訊息 (例如 PRINT 陳述式的輸出),除非您指定 Windows PowerShell -Verbose 共用參數。例如:
Invoke-Sqlcmd -Query "PRINT N'abc';" -Verbose
並非所有的 sqlcmd 參數都是 Windows PowerShell 環境所需。例如,Windows PowerShell 會從指令程式格式化所有輸出,所以 Invoke-Sqlcmd 中不會實作用於指定格式化選項的 sqlcmd 參數。下表顯示 Invoke-Sqlcmd 參數與 sqlcmd 選項之間的關聯性:
描述 |
sqlcmd 選項 |
Invoke-Sqlcmd 參數 |
---|---|---|
伺服器和執行個體名稱。 |
-S |
-ServerInstance |
要使用的初始資料庫。 |
-d |
-Database |
執行指定的查詢並結束。 |
-Q |
-Query |
SQL Server 驗證登入識別碼。 |
-U |
-Username |
SQL Server 驗證密碼。 |
-P |
-Password |
變數定義。 |
-v |
-Variable |
查詢逾時間隔。 |
-t |
-QueryTimeout |
發生錯誤時停止執行 |
-b |
-AbortOnError |
專用管理員連接。 |
-A |
-DedicatedAdministratorConnection |
停用互動式命令、啟動指令碼和環境變數。 |
-X |
-DisableCommands |
停用變數替代。 |
-x |
-DisableVariables |
報表的最小嚴重性層級。 |
-V |
-SeverityLevel |
報表的最小錯誤層級。 |
-m |
-ErrorLevel |
登入逾時間隔。 |
-l |
-ConnectionTimeout |
主機名稱。 |
-H |
-HbostName |
變更密碼並結束。 |
-Z |
-NewPassword |
含有查詢的輸入檔 |
-i |
-InputFile |
字元輸出的最大長度。 |
-w |
-MaxCharLength |
二進位輸出的最大長度。 |
-w |
-MaxBinaryLength |
使用 SSL 加密進行連接 |
無參數 |
-EncryptConnection |
顯示錯誤 |
無參數 |
-OutputSqlErrors |
輸出訊息至 stderr。 |
-r |
無參數 |
使用用戶端的地區設定 |
-R |
無參數 |
執行指定的查詢並維持執行中狀態。 |
-q |
無參數 |
用於輸出資料的字碼頁。 |
-f |
無參數 |
變更密碼並維持執行中狀態 |
-z |
無參數 |
封包大小 |
-a |
無參數 |
資料行分隔符號 |
-s |
無參數 |
控制項輸出標頭 |
-h |
無參數 |
指定控制字元 |
-k |
無參數 |
固定長度的顯示寬度 |
-Y |
無參數 |
變動長度的顯示寬度 |
-y |
無參數 |
回應輸入。 |
-e |
無參數 |
啟用引號識別碼 |
-I |
無參數 |
移除尾端空白 |
-W |
無參數 |
列出執行個體 |
-L |
無參數 |
將輸出格式化為 Unicode |
-u |
無參數 |
列印統計資料 |
-p |
無參數 |
命令結束 |
-c |
無參數 |
使用 Windows 驗證來連接 |
-E |
無參數 |