Invoke-Sqlcmd 是 SQL Server Cmdlet,可執行腳本,其中包含來自 sqlcmd 公用程式所支援的語句(Transact-SQL 和 XQuery) 和命令。
使用 Invoke-Sqlcmd
Invoke-Sqlcmd Cmdlet 可讓您在 Windows PowerShell 環境中執行 sqlcmd 腳本檔案。 您也可以使用 Invoke-Sqlcmd 來完成使用 sqlcmd 執行的大部分工作。
這是呼叫 Invoke-Sqlcmd 來執行簡單查詢的範例,類似於使用 -Q 和 -S 選項指定 sqlcmd:
Invoke-Sqlcmd -Query "SELECT GETDATE() AS TimeOfQuery;" -ServerInstance "MyComputer\MyInstance"
這是呼叫 Invoke-Sqlcmd、指定輸入檔並將輸出管線傳送至檔案的範例。這類似於使用 -i 和 -o 選項指定 sqlcmd:
Invoke-Sqlcmd -InputFile "C:\MyFolder\TestSQLCmd.sql" | Out-File -FilePath "C:\MyFolder\TestSQLCmd.rpt"
這是使用 Windows PowerShell 陣列將多個 sqlcmd 腳本變數傳遞至 Invoke-Sqlcmd 的範例。 識別 SELECT 語句中 sqlcmd 腳本變數的 “$” 字元已使用 PowerShell 反向勾選 “'” 逸出字元來逸出:
$MyArray = "MyVar1 = 'String1'", "MyVar2 = 'String2'"
Invoke-Sqlcmd -Query "SELECT `$(MyVar1) AS Var1, `$(MyVar2) AS Var2;" -Variable $MyArray
這是使用適用於 Windows PowerShell 的 SQL Server 提供者巡覽至 Database Engine 實例的範例,然後使用 Windows PowerShell Get-Item Cmdlet 擷取實例的 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 的資料庫內容是由呼叫 Cmdlet 時作用中的路徑所設定。
| 路徑 | 資料庫內容 |
|---|---|
| 從 SQLSERVER 以外的磁碟驅動器開始: | 本機計算機上預設實例中登入標識碼的預設資料庫。 |
| SQLSERVER:\SQL | 本機計算機上預設實例中登入標識碼的預設資料庫。 |
| SQLSERVER:\SQL\ComputerName | 指定計算機上預設實例中登入標識碼的預設資料庫。 |
| SQLSERVER:\SQL\ComputerName\InstanceName | 指定計算機上指定實例中登入標識碼的預設資料庫。 |
| SQLSERVER:\SQL\ComputerName\InstanceName\Databases | 指定計算機上指定實例中登入標識碼的預設資料庫。 |
| SQLSERVER:\SQL\ComputerName\InstanceName\Databases\DatabaseName | 指定計算機上指定實例中的指定資料庫。 這也適用於較長的路徑,例如指定資料庫內 [數據表和數據行] 節點的路徑。 |
例如,假設本機計算機預設實例中 Windows 帳戶的預設資料庫是 master。 然後,下列命令會傳回 master:
Set-Location SQLSERVER:\SQL
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"
下列命令會傳回 AdventureWorks2012:
Set-Location SQLSERVER:\SQL\MyComputer\DEFAULT\Databases\AdventureWorks2012\Tables\Person.Person
Invoke-Sqlcmd "SELECT DB_NAME() AS DatabaseName;"
Invoke-Sqlcmd 使用路徑資料庫內容時提供警告。 您可以使用 -SuppressProviderContextWarning 參數來關閉警告訊息。 您可以使用 -IgnoreProviderContext 參數,告訴 Invoke-Sqlcmd 一律使用預設資料庫進行登入。
比較 Invoke-Sqlcmd 和 sqlcmd 公用程式
Invoke-Sqlcmd 可用來執行許多可使用 sqlcmd 公用程式執行的腳本。 不過, Invoke-Sqlcmd 會在與 sqlcmd 執行所在的 命令提示字元環境不同的 Windows PowerShell 環境中執行。 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
PowerShell 環境中不需要所有的 sqlcmd 參數。 例如,Windows PowerShell 會格式化 Cmdlet 的所有輸出,因此不會在 Invoke-Sqlcmd 中實作指定格式化選項的 sqlcmd 參數。 下表顯示 Invoke-Sqlcmd 參數與 sqlcmd 選項之間的關聯性:
| 說明 | sqlcmd 選項 | Invoke-Sqlcmd 參數 |
|---|---|---|
| 伺服器和實例名稱。 | -S | -伺服器實例 |
| 要使用的初始資料庫。 | -d | -資料庫 |
| 執行指定的查詢並結束。 | -Q | -查詢 |
| SQL Server 驗證登入標識碼。 | -U | -Username |
| SQL Server 驗證密碼。 | -P | -密碼 |
| 變數定義。 | -v | -變數 |
| 查詢超時時間間隔。 | -t | -QueryTimeout |
| 當發生錯誤時停止運行 | -b | -AbortOnError |
| 專用系統管理員連線。 | -A | -專用管理員連接 |
| 停用互動式命令、啟動腳本和環境變數。 | -X | -停用指令 |
| 停用變數替代。 | -x | -停用變數 |
| 要報告的嚴重性層級下限。 | -V | -SeverityLevel |
| 要報告的最小錯誤層級。 | -m | -錯誤層級 |
| 登入超時時間間隔 | -l | -連線超時(ConnectionTimeout) |
| 主機名。 | -H | -主機名稱 |
| 變更密碼並結束。 | -Z | -新密碼 |
| 包含查詢的輸入檔 | -i | -InputFile |
| 字元輸出的最大長度。 | -w | -MaxCharLength |
| 二進位輸出的最大長度。 | -w | -最大二進制長度 |
| 使用 SSL 加密進行連線。 | 無參數 | -EncryptConnection |
| 顯示錯誤 | 無參數 | -OutputSqlErrors |
| 將訊息輸出至 stderr。 | -r | 無參數 |
| 使用客戶端的區域設定 | -R | 無參數 |
| 執行指定的查詢並繼續執行。 | -q | 無參數 |
| 用於輸出數據的代碼頁。 | -f | 無參數 |
| 變更密碼並繼續執行 | -z | 無參數 |
| 封包大小 | -a | 無參數 |
| 資料行分隔符號 | -S | 無參數 |
| 控制輸出標頭 | -h | 無參數 |
| 指定控制字元 | -k | 無參數 |
| 固定長度顯示寬度 | -Y | 無參數 |
| 可調顯示寬度 | -y | 無參數 |
| 回應輸入 | -e | 無參數 |
| 啟用引號識別符 | -我 | 無參數 |
| 拿掉尾端空格 | -W | 無參數 |
| 列出執行個體 | -L | 無參數 |
| 將輸出格式化為 Unicode | -u | 無參數 |
| 列印統計資料 | -p | 無參數 |
| 命令結束 | -c | 無參數 |
| 使用 Windows 驗證進行連線 | -E | 無參數 |