共用方式為


使用 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 指令碼變數的 "$" 字元已經使用 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 指令程式擷取此執行個體的 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;"

下列命令則傳回 AdventureWorks2008R2:

Set-Location SQLSERVER:\SQL\MyComputer\DEFAULT\Databases\AdventureWorks2008R2\Tables\Person.Person
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 參數都是 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

無參數