共用方式為


SQLCMD 工具

適用於:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics分析平台系統(PDW)Microsoft Fabric 中的 SQL 資料庫

使用 sqlcmd 工具透過多種模式輸入 Transact-SQL 語句、系統程序及腳本檔案:

  • 在命令提示字元中。
  • 查詢編輯器SQLCMD 模式下
  • 在 Windows 指令碼檔案中。
  • 在 SQL Server Agent 作業的作業系統 (cmd.exe) 作業步驟中。

Note

雖然 Microsoft Entra ID 是 Azure Active Directory(Azure AD)的新名稱,但為了防止破壞現有的環境,Azure AD 仍會保留在某些硬式編碼元素中,例如 UI 字段、連線提供者、錯誤碼和 Cmdlet。 在本文中,這兩個名稱是可互換的。

sqlcmd 變體

sqlcmd 有兩種變體:

  • sqlcmd (Go): go-mssqldbsqlcmd,有時樣式為 go-sqlcmd。 此版本是獨立工具,您可以獨立於 SQL Server 下載。 它會在 Windows、macOS、Linux 和容器中執行。

  • sqlcmd (ODBC):平臺對齊的 ODBC 型 sqlcmd,可與 SQL Server 或 Microsoft 命令行公用程式搭配使用,以及 Linux 上套件的 mssql-tools 一部分。 它也會在 Windows、macOS、Linux 和容器中執行。

若要找出系統上已安裝哪些 sqlcmd 變體和版本,請參閱 檢查已安裝的 sqlcmd 公用程式版本

如需如何取得 sqlcmd 的資訊,請參閱 下載並安裝 sqlcmd 公用程式

TDS 8.0 支援

SQL Server 2025(17.x)引入了 TDS 8.0 對 sqlcmd 工具的支援。

Syntax

在本文中, 選項參數命令列參數開關 這三個術語是可互換的。

sqlcmd (Go)有兩種說明模式: --help 用於現代子指令與 -? ODBC 相容旗標。

現代命令(--help)

Usage:
  sqlcmd [flags]
  sqlcmd [command]

Examples:
# Install/Create, Query, Uninstall SQL Server
  sqlcmd create mssql --accept-eula --using https://aka.ms/AdventureWorksLT.bak
  sqlcmd open ads
  sqlcmd query "SELECT @@version"
  sqlcmd delete
# View configuration information and connection strings
  sqlcmd config view
  sqlcmd config cs

Available Commands:
  completion  Generate the autocompletion script for the specified shell
  config      Modify sqlconfig files using subcommands like "sqlcmd config use-context mssql"
  create      Install/Create SQL Server, Azure SQL, and Tools
  delete      Uninstall/Delete the current context
  help        Help about any command
  open        Open tools (e.g ADS) for current context
  query       Run a query against the current context
  start       Start current context
  stop        Stop current context

Flags:
  -?, --?                  help for backwards compatibility flags (-S, -U, -E etc.)
  -h, --help               help for sqlcmd
      --sqlconfig string   configuration file (default "/Users/<currentUser>/.sqlcmd/sqlconfig")
      --verbosity int      log level, error=0, warn=1, info=2, debug=3, trace=4 (default 2)
      --version            print version of sqlcmd

Use "sqlcmd [command] --help" for more information about a command.

ODBC 相容旗標(-?)

sqlcmd
   -a packet_size
   -A (dedicated administrator connection)
   -b (terminate batch job if there is an error)
   -c batch_terminator
   -C (trust the server certificate)
   -d db_name
   -e (echo input)
   -E (use trusted connection)
   -F hostname_in_certificate
   -g (enable column encryption)
   -G (use Azure Active Directory for authentication)
   -h rows_per_header
   -H workstation_name
   -i input_file
   -I (enable quoted identifiers, always on)
   -k[1 | 2] (remove or replace control characters)
   -K application_intent
   -l login_timeout
   -L[c] (list servers, optional clean output)
   -m error_level
   -M multisubnet_failover (always enabled)
   -N[s|m|o] (encrypt connection)
   -o output_file
   -P password
   -q "cmdline query"
   -Q "cmdline query" (and exit)
   -r[0 | 1] (msgs to stderr)
   -R (ignored, client regional settings not used)
   -s col_separator
   -S [protocol:]server[instance_name][,port]
   -t query_timeout
   -u (unicode output file)
   -U login_id
   -v var = "value"
   -V error_severity_level
   -w screen_width
   -W (remove trailing spaces)
   -x (disable variable substitution)
   -X[1] (disable commands, startup script, environment variables, optional exit)
   -y variable_length_type_display_width
   -Y fixed_length_type_display_width
   -z new_password
   -Z new_password (and exit)
   --authentication-method (Azure SQL authentication method)
   --driver-logging-level (mssql driver log level)
   --vertical (print results in vertical format)
   -? (usage)

sqlcmd 中的重大變更 (ODBC)

sqlcmd(Go)工具中有幾個選項和行為不同。 有關最新的缺少向後相容旗標清單,請參見 GitHub 上的「優先實作向後相容旗標」討論。

  • SQLCMD (Go)支援此 -P 切換。 對於 SQL Server 認證,您可以透過以下機制提供密碼:

    • -P命令列交換器
    • SQLCMDPASSWORD 環境變數
    • :CONNECT 命令
    • 當被要求輸入密碼時,輸入密碼即可完成連線
  • -r 切換需要 01 參數。

  • -R這個開關被忽略了。 Go 執行時不提供使用者在地資訊的存取。

  • -I這個開關被忽略了。 引號識別符始終啟用。 若要停用引號識別項行為,請在指令碼中新增 SET QUOTED IDENTIFIER OFF

  • -M這個開關被忽略了。 sqlcmd (Go)總是啟用多子網路容錯移轉。

  • -N取一個字串值來指定加密選項,該選項為 s[trict]t[rue]/m[andatory]/yes/1o[ptional]/no/0/f[alse] 或 。disable

    • 如果你不提供 -N-Csqlcmd 會與伺服器協商認證,卻不會驗證伺服器憑證。
    • 如果你提供 -N 但沒有 -Csqlcmd 需要驗證伺服器憑證。 加密的 false 值仍然可能會導致登入封包的加密。
    • 如果您同時提供 -N-Csqlcmd 會使用這些值進行加密協商。
    • 欲了解更多關於客戶端/伺服器加密協商的資訊,請參見 MS-TDS PRELOGIN

    Important

    在 SQL Server 2025(17.x)中, -N 可以是 o (對於 optional)、 m (對於 mandatory,預設為),或 s (對於 strict)。 如果您未包含 -N-Nm 則 (for mandatory) 是預設值。 此行為是 SQL Server 2022(16.x)及更早版本的重大變更。

  • 使用-u 開關時,產生的 Unicode 輸出檔案會預置 UTF-16 小端序位元組序標記(BOM)。

  • 為了維持與 相容性而保留的某些 OSQL 行為可能已變更,例如某些數據類型的數據行標頭對齊方式。

  • 所有命令必須在一行內,即使是EXIT。 互動式模式不會檢查命令的左括號或引號,且不會提示連續行。 此行為與 ODBC 版本不同,後者允許查詢 EXIT(query) 跨越多行。

sqlcmd (Go)支援共享記憶體、命名管線及 TCP 傳輸。 在伺服器名稱上使用適當的協定前綴來強制執行協定:

  • lpc 用於共享記憶體(僅限本地主機)
  • np 用於命名管線,或使用 UNC 的命名管路作為伺服器名稱
  • tcp 對於 TCP 來說

如果你沒有指定協定,sqlcmd 會嘗試依照以下順序lpc>np>tcp撥號: 。 連接遠端主機時, lpc 會跳過。

Enhancements

  • :Connect具有選擇性-G參數,可選取 Azure SQL Database 的其中一個驗證方法 - SqlAuthentication、、ActiveDirectoryDefaultActiveDirectoryIntegratedActiveDirectoryServicePrincipalActiveDirectoryManagedIdentityActiveDirectoryPassword。 如需詳細資訊,請參閱 在 sqlcmd 中使用 Microsoft Entra ID 進行驗證。 如果未提供 -G,則會使用整合式安全性或 SQL Server 驗證,視 -U 使用者名稱參數是否存在而定。

  • --driver-logging-level命令行參數可讓您查看驅動程序的go-mssqldb追蹤。 使用 64 來查看所有追蹤記錄。

  • sqlcmd (Go) 可以使用垂直格式列印結果。 使用--vertical命令行開關來設定它。 SQLCMDFORMAT 指令碼變數也會進行控制。

命令列選項

下表列出 sqlcmd 中可用的命令行選項,以及它們支援的作系統。

命令行選項 支援於 Windows 上 Linux 和macOS上支援
登入相關選項
-A Yes No
-C Yes Yes
- db_name Yes Yes
-D Yes Yes
-我 login_timeout Yes Yes
-E Yes Yes
-F hostname_in_certificate Yes Yes
-g Yes Yes
-G Yes Yes
-H workstation_name Yes Yes
-j Yes Yes
-J server_certificate No Yes
-好 application_intent Yes Yes
-M multisubnet_failover Yes Yes
-不[s|m|o] Yes Yes
-P 密碼 Yes Yes
-S [協議:]伺服器[\instance_name][,port] Yes Yes
-U login_id Yes Yes
-Z new_password Yes Yes
-Z new_password Yes Yes
輸入/輸出選項
-f codepage | i:codepage[,o:codepage] | o:codepage[,i:codepage] Yes Yes
-我 input_file[,input_file2...] Yes Yes
-喔 output_file Yes Yes
-r[0 | 1] Yes Yes
-R Yes Yes
-u Yes Yes
查詢執行選項
-e Yes Yes
-I Yes Yes
-q “cmdline query Yes Yes
-Q “cmdline query Yes Yes
-T query_timeout Yes Yes
-v var = value [ var = value... ] Yes No
-x Yes Yes
格式選項
-h 標頭 Yes Yes
-k [1 | 2] Yes Yes
-s col_separator Yes Yes
-W screen_width Yes Yes
-W Yes Yes
-Y variable_length_type_display_width Yes Yes
-Y 固定長度類型顯示寬度 (fixed_length_type_display_width) Yes Yes
錯誤報告選項
-b Yes Yes
-我 error_level Yes Yes
-V error_severity_level Yes Yes
其他選項
-packet_size Yes Yes
-C batch_terminator Yes Yes
-L[c] Yes No
-p[1] Yes Yes
-X[1] Yes Yes
-? Yes Yes

-A

適用於:僅限 Windows。 不支援 Linux 和 macOS。

使用專用管理員連接 (DAC) 來登入 SQL Server。 用這種連線來排除伺服器故障。 此連接只適用於支援 DAC 的伺服器電腦。 如果無法使用 DAC,sqlcmd 會產生一則錯誤訊息,並結束作業。 如需 DAC 的詳細資訊,請參閱 資料庫管理員的診斷連線-A 選項不支援 -G 選項。 使用 -A 連接到 Azure SQL 資料庫時,您必須是邏輯 SQL 伺服器的管理員。 DAC 不適用於 Microsoft Entra 系統管理員。

Note

如需如何在 macOS 或 Linux 上建立專用系統管理員連線 (DAC) 的資訊,請參閱 程式設計指導方針

-C

使用此選項設定用戶端隱含信任伺服器憑證而無需驗證。 這個選項相當於 ADO.NET 選項 TRUSTSERVERCERTIFICATE = true

對於 sqlcmd (Go) 公用程式,下列條件也適用:

  • 如果你不提供 -N-Csqlcmd 會與伺服器協商認證,卻不會驗證伺服器憑證。
  • 如果你提供 -N 但沒有 -Csqlcmd 需要驗證伺服器憑證。 加密的 false 值仍然可能會導致登入封包的加密。
  • 如果您同時提供 -N-Csqlcmd 會使用這些值進行加密協商。

-D db_name

當您啟動 USE <db_name> 時發出 陳述式。 此選項會設定 sqlcmd 指令碼變數 SQLCMDDBNAME。 這項參數會指定初始資料庫。 預設值為您登入帳號的預設資料庫屬性。 如果資料庫不存在,系統會產生一則錯誤訊息,且會結束 sqlcmd

-D

將提供給 -S 的伺服器名稱解譯為 DSN,而不是主機名稱。 如需詳細資訊,請參閱 sqlcmd 和 bcp 中的 DSN 支援

Note

只有 Linux 和 macOS 用戶端可使用 -D 選項。 在 Windows 用戶端中,它指的是一個過時的選項,該選項會被移除並忽略。

-我 login_timeout

指定在您嘗試連接到伺服器時, sqlcmd 登入 ODBC 驅動程式逾時之前的秒數。 此選項會設定 sqlcmd 指令碼變數 SQLCMDLOGINTIMEOUTsqlcmd 的預設登入逾時值是 8 秒。 建議當使用 -G 選項連接到 Azure SQL Database 或 Azure Synapse Analytics 並透過 Microsoft Entra ID 進行認證時,將逾時值設為至少 30 秒。 登入逾時必須是介於 065534之間的數字。 如果值不是數字,或不在該範圍內, sqlcmd 會產生錯誤訊息。 0 值指定逾時為無限。

-E

使用信任連線登入 SQL Server,而不用使用者名稱和密碼。 根據預設,如果沒有指定 -Esqlcmd 會使用信任連接選項。

-E 選項會忽略可能出現的使用者名稱與密碼環境變數設定,例如 SQLCMDPASSWORD。 如果 -E 選項與 -U 選項或 -P 選項一起使用,則會產生錯誤訊息。

Note

如需從 Linux 或 macOS 用戶端建立使用整合式驗證之受信任連線的詳細資訊,請參閱 使用整合式驗證

-F hostname_in_certificate

指定在伺服器憑證驗證期間要使用的伺服器憑證中不同的預期一般名稱 (CN) 或主體別名 (SAN)。 若無此選項,憑證驗證可確保憑證中的 CN 或 SAN 符合您要連線的伺服器名稱。 當伺服器名稱與 CN 或 SAN 不符時,例如使用 DNS 別名時,可以使用這個參數。

例如:

sqlcmd -S server01 -Q "SELECT TOP 100 * FROM WideWorldImporters.Sales.Orders" -A -Ns -F server01.adventure-works.com

Note

sqlcmd (Go)也用於 -F 伺服器憑證中指定主機名稱。 若要以垂直格式列印結果, sqlcmd (Go)則使用 --vertical 切換器。

-g

將 [資料行加密設定] 設定為 Enabled。 如需詳細資訊,請參閱 Always Encrypted。 僅支援儲存在 Windows 憑證存放區中的主要金鑰。 -g 選項至少需要 sqlcmd13.1 版。 要決定你的版本,執行 sqlcmd -?

-G

使用此選項在連接 Azure SQL 資料庫或 Azure Synapse Analytics 時,使用 Microsoft Entra 進行認證。 此選項會設定 sqlcmd 指令碼變數 SQLCMDUSEAAD = true-G 選項至少需要 sqlcmd13.1 版。 要決定你的版本,執行 sqlcmd -?。 如需詳細資訊,請參閱 Microsoft Azure SQL 的 Entra 驗證-A 選項不支援 -G 選項。

-G 選項僅適用於 Azure SQL Database 與 Azure Synapse Analytics。

Linux 或 macOS 目前不支援 Microsoft Entra 互動式驗證。 Microsoft Entra 整合式驗證需要 下載 ODBC Driver for SQL Server 17.6.1 版或更新版本,以及 正確設定的 Kerberos 環境

如需Microsoft Entra 驗證的詳細資訊,請參閱 在 sqlcmd 中使用 Microsoft Entra ID 進行驗證

-H workstation_name

這是工作站名稱。 此選項會設定 sqlcmd 指令碼變數 SQLCMDWORKSTATION。 工作站名稱會出現在 hostname 目錄檢視的 sys.sysprocesses 欄位中,並可透過 sp_who 儲存程序回傳。 如果你沒指定這個選項,預設就是目前的電腦名稱。 使用此名稱來識別不同的 sqlcmd 會話。

-j

將原始錯誤訊息列印至畫面。

-J server_certificate

適用於sqlcmd (ODBC)、Linux 和 macOS。 不支援 Windows。

指定伺服器憑證檔案的路徑。 此檔案會與伺服器的連線加密憑證進行比對。 這種匹配方式取代了標準的憑證驗證(如到期日期、主機名稱、信任鏈等)。 接受的憑證格式為 PEM、DER 和 CER。

連接使用自簽憑證或由私人憑證授權機構發行憑證的伺服器時,請使用此選項。 若啟用加密且憑證驗證失敗,連線即告失敗。

例如:

sqlcmd -S server01 -Q "SELECT TOP 100 * FROM WideWorldImporters.Sales.Orders" -A -Ns -J /etc/ssl/certs/server_certificate.cer

-好 application_intent

宣告連接到伺服器時的應用程式工作負載類型。 目前唯一支援的值是 ReadOnly。 如果你沒特別指定 -Ksqlcmd 不支援連接可用性群組中的次要副本。 如需詳細資訊,請參閱將唯讀工作負載卸載至 Always On 可用性群組的次要複本

Note

-K SUSE Linux Enterprise Server (SLES) 不支援 。 不過,您可以在傳遞至 ApplicationIntent=ReadOnly 的 DSN 檔案中指定 關鍵詞。 如需詳細資訊,請參閱本文稍後 的 sqlcmd 和 bcp 中的 DSN 支援

如需詳細資訊,請參閱 Linux 和 macOS 上的高可用性和災害復原

-M multisubnet_failover

在連線至 SQL Server 的可用性群組接聽程式或 SQL Server 容錯移轉叢集執行個體時,務必指定 -M-M 可提供對 (目前) 作用中伺服器更快速的偵測和連線。 如果你未指定 -M-M 就會關閉。

如需詳細資訊,請參閱:

Note

-M SUSE Linux Enterprise Server (SLES) 不支援 。 不過,您可以在傳遞至 MultiSubnetFailover=Yes 的 DSN 檔案中指定 關鍵詞。 如需詳細資訊,請參閱本文稍後 的 sqlcmd 和 bcp 中的 DSN 支援

如需詳細資訊,請參閱 Linux 和 macOS 上的高可用性和災害復原

-不[s|m|o]

用戶端會使用此選項來請求加密連線。

-N開關可以是o(對於optional)、m(對於mandatory,預設值)、或s(對於strict)。 若不包含 -N,預設為 -Nm (對 mandatory)。 此預設值是與 SQL Server 2022(16.x)及更早版本相比的重大變更,當時的預設為 -No

針對 sqlcmd (Go) 公用程式,-N接受可以是 、 truefalsedisable 的字串值來指定加密選擇。 (default 與省略參數相同):

  • 如果你不提供 -N-Csqlcmd 會與伺服器協商認證,卻不會驗證伺服器憑證。

  • 如果你提供 -N 但沒有 -Csqlcmd 需要驗證伺服器憑證。 加密的 false 值仍然可能會導致登入封包的加密。

  • 如果您同時提供 -N-Csqlcmd 會使用這些值進行加密協商。

-P 密碼

使用者指定的密碼。 密碼會區分大小寫。 如果你使用這個 -U 選項,但沒有使用 -P 或設定 SQLCMDPASSWORD 環境變數, sqlcmd 會提示使用者輸入密碼。 不要使用空密碼(null),但你可以用一對連續的雙引號來指定空""密碼()。

Important

使用 -P 是不安全的。 請避免在命令列上提供密碼。 或者,使用 SQLCMDPASSWORD 環境變數,或省略 -P 選項以互動方式輸入密碼。

使用 強密碼

密碼提示的顯示方式,會以將密碼提示輸出到主控台的方式顯示,如: Password:

使用者輸入為隱藏狀態。 這表示畫面上不會顯示任何內容,而且游標也不會移動。

SQLCMDPASSWORD 環境變數可讓您設定目前工作階段的預設密碼。 因此,您不需要將密碼寫在批次檔中。 下列範例會先在命令提示字元處設定 SQLCMDPASSWORD 變數,再存取 sqlcmd 公用程式。

在命令提示字元中,輸入下列命令。 以有效的密碼取代 <password>

SET SQLCMDPASSWORD=<password>
sqlcmd
SET SQLCMDPASSWORD=<password>
sqlcmd
SET SQLCMDPASSWORD=<password>
sqlcmd

如果使用者名稱和密碼的組合不正確,會產生錯誤訊息。

Note

OSQLPASSWORD環境變數會保留以供回溯相容性使用。 SQLCMDPASSWORD 環境變數優先於 OSQLPASSWORD 環境變數。 這表示您可以先後使用 sqlcmdosql ,而不會發生互相干擾的狀況。 舊腳本會繼續運作。

如果使用 -P 選項和 -E 選項,會產生錯誤訊息。

如果你使用包含多個參數的 -P 選項,會產生錯誤訊息並讓程式退出。

包含特殊字元的密碼可能會產生錯誤訊息。 您應在使用 -P 時逸出特殊字元,或改用 SQLCMDPASSWORD 環境變數。

在 Linux 和 macOS 上,當與 -G 選項搭配且不使用 -U 時,-P 指定包含存取令牌的檔案(v17.8+)。 令牌檔案應為UTF-16LE(無 BOM) 格式。

您可以透過各種方法取得存取令牌。 您必須確保存取權杖逐位元組相符,因為它被傳送 as-is。 以下範例指令會取得一個訪問令牌。 此命令會使用 Azure CLI 和 Linux 命令,並以適當的格式將它儲存至檔案。 如果您的系統或終端機的預設編碼不是 ASCII 或 UTF-8,您可能需要調整 iconv 選項。 請務必小心保護產生的檔案,並在不再需要時將其刪除。

az account get-access-token --resource https://database.windows.net --output tsv | cut -f 1 | tr -d '\n' | iconv -f ascii -t UTF-16LE > /tmp/tokenFile

-S [協議:]伺服器[\instance_name][,port]

指定要連接的 SQL Server 執行個體。 此選項會設定 sqlcmd 指令碼變數 SQLCMDSERVER

指定 server_name,即可連線至該伺服器電腦上之 SQL Server 的預設執行個體。 指定 server_name[\instance_name],即可連線到該伺服器電腦的 SQL Server 具名執行個體。 如果你沒有指定伺服器電腦, sqlcmd 會連接到本地電腦上的預設 SQL Server 實例。 當你從網路上的遠端電腦執行 sqlcmd 時,這個選項是必須的。

protocol 可以是 tcp (TCP/IP)、lpc (共用記憶體) 或 np (具名管道)。

如果您啟動 sqlcmd 時,並未指定 server_name[\instance_name],SQL Server 會檢查並使用 SQLCMDSERVER 環境變數。

Note

OSQLSERVER環境變數會保留以供回溯相容性使用。 SQLCMDSERVER 環境變數優先於 OSQLSERVER 環境變數。 這表示您可以先後使用 sqlcmdosql ,而不會發生互相干擾的狀況。 舊腳本會繼續運作。

Linux 和 macOS 上的 ODBC 驅動程式需要 -S。 唯一有效的通訊協定值為 tcp

-你 login_id

登入名稱或包含在資料庫內的使用者名稱。 針對限定資料庫使用者,您必須提供資料庫名稱選項 (-d)。

Note

OSQLUSER環境變數會保留以供回溯相容性使用。 SQLCMDUSER 環境變數優先於 OSQLUSER 環境變數。 這表示您可以先後使用 sqlcmdosql ,而不會發生互相干擾的狀況。 舊腳本會繼續運作。

如果沒有指定 -U 選項或 -P 選項,sqlcmd 會嘗試使用 Windows 驗證模式進行連線。 這項驗證以執行 sqlcmd 之使用者的 Windows 帳戶為基礎。

如果您同時使用 -U 選項和 -E 選項(將在本文後面說明),就會產生錯誤訊息。 如果 -U 選項後面有多個引數,就會產生錯誤訊息並結束程式。

-Z new_password

變更密碼。 以舊密碼取代 <oldpassword>,並以新密碼 <newpassword>

sqlcmd -U someuser -P <oldpassword> -z <newpassword>
sqlcmd -U someuser -P <oldpassword> -z <newpassword>
sqlcmd -U someuser -P <oldpassword> -z <newpassword>

-Z new_password

變更密碼並結束。 以舊密碼取代 <oldpassword>,並以新密碼 <newpassword>

sqlcmd -U someuser -P <oldpassword> -Z <newpassword>
sqlcmd -U someuser -P <oldpassword> -Z <newpassword>
sqlcmd -U someuser -P <oldpassword> -Z <newpassword>

輸入與輸出選項

-f 編碼頁 |i:編碼頁[,o:編碼頁] |o:編碼頁[,i:編碼頁]

指定輸入和輸出字碼頁。 代碼頁面編號是指定已安裝 Windows 代碼頁的數值。

代碼頁轉換規則:

  • 如果你沒有指定程式碼頁, sqlcmd 會同時使用目前的程式碼頁作為輸入和輸出檔案,除非輸入檔是 Unicode 檔案,這時不需要轉換。

  • sqlcmd 會自動識別位元組由大到小 (Big-Endian) 和位元組由小到大 (Little-Endian) 的 Unicode 輸入檔。 如果你指定 -u 選項,則輸出永遠是小端序 Unicode。

  • 如果你沒指定輸出檔,輸出代碼頁就是主控台代碼頁。 此方法可讓輸出正確地顯示在主控台上。

  • 假設多個輸入檔案使用相同的代碼頁。 Unicode 與非 Unicode 的輸入檔可以混合使用。

在命令提示字元下輸入 chcp,以驗證 cmd.exe 的字碼頁。

Note

在 Linux 上,代碼頁編號是一個數值,指定已安裝的 Linux 代碼頁(自 17.5.1.1 起可用)。

-我 input_file[,input_file2...]

識別包含 Transact-SQL 陳述式或預存程序的批次之檔案。 你可以指定多個檔案, sqlcmd 依序讀取和處理。 檔案名稱之間不能有空格。 SQL CMD 首先檢查是否存在所有指定的檔案。 如果有一個或多個檔案不存在,sqlcmd 會結束作業。 -i這個選項和-Q/-q這些選項是互相排斥的。

Note

如果您使用 -i 選項後面接著一或多個額外的參數,則必須使用 參數與值之間的空格。 這個要求在 sqlcmd (Go)中是已知的問題。

路徑範例:

-i C:\<filename>
-i \\<Server>\<Share$>\<filename>
-i "C:\Some Folder\<file name>"

包含空格的檔案路徑必須用引號括住。

你可以多次使用此選項:

sqlcmd -i <input_file1> -i <input_file2>
sqlcmd -i <input_file1> -i <input_file2>
sqlcmd -i <input_file1> -i <input_file2>

-o 輸出檔案

識別用來接收 sqlcmd 輸出的檔案。

如果你指定 -usqlcmd 會以 Unicode 格式儲存 output_file 。 如果檔名不正確, sqlcmd 會產生錯誤訊息並退出。 sqlcmd 不支援同時將多個 sqlcmd 處理序寫入相同的檔案。 如果發生這種情況,就當作檔案輸出損壞或錯誤。 -f 選項也與檔案格式相關。 如果這個檔案不存在,SQL CMD 會建立它。 SQLcmd 會覆寫先前會話中同名的檔案。 此處所指定的檔案並不是 stdout 檔案。 如果你指定一個 stdout 檔案, sqlcmd 就不會使用這個檔案。

路徑範例:

-o C:< filename>
-o \\<Server>\<Share$>\<filename>
-o "C:\Some Folder\<file name>"

包含空格的檔案路徑必須用引號括住。

-r[0 | 1]

將錯誤訊息輸出重新導向至畫面 (stderr)。 如果您沒有指定參數,或指定 0,只會重新導向嚴重性層級 11 (含) 以上的錯誤訊息。 如果您指定 1,便會重新導向包括 PRINT 在內的所有錯誤訊息輸出。 如果您使用 -o,此選項沒有任何作用。 根據預設,訊息會傳送到 stdout

Note

對於 sqlcmd (Go) 公用程式,-r 需要 01 引數。

-R

僅適用於sqlcmd (ODBC)。

sqlcmd 根據用戶端的地區設定,將從 SQL Server 擷取的數值、貨幣、日期和時間資料行當地語系化。 根據預設,這些資料行會使用伺服器的地區設定來顯示。

Note

在 Linux 和 macOS 上, -R 目前只會使用 en_US (US English) 格式。

-u

指定無論 input_file 的格式為何, output_file 均以 Unicode 格式儲存。

Note

對於 sqlcmd (Go)工具,產生的 Unicode 輸出檔會以 UTF-16 小端位元組序標記(BOM)作為前綴。

查詢執行選項

-e

將輸入指令碼寫入標準輸出裝置 (stdout) 中。

-I

僅適用於sqlcmd (ODBC)。

SET QUOTED_IDENTIFIER 連線選項設定為 ON。 預設設定是 OFF。 如需詳細資訊,請參閱 SET QUOTED_IDENTIFIER

Note

若要在 sqlcmd (Go) 公用程式中停用引號識別項行為,請在指令碼中新增 SET QUOTED IDENTIFIER OFF

-q "命令行查詢"

sqlcmd 開始時執行查詢,但查詢結束後不會退出 sqlcmd 。 你可以執行多個用分號分隔的查詢。 請依照下列範例所示,利用引號來括住查詢。

在命令提示字元中,輸入:

sqlcmd -d AdventureWorks2025 -q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"
sqlcmd -d AdventureWorks2025 -q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
sqlcmd -d AdventureWorks2025 -q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"
sqlcmd -d AdventureWorks2025 -q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
sqlcmd -d AdventureWorks2025 -q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"
sqlcmd -d AdventureWorks2025 -q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"

Important

請勿在查詢中使用 GO 結束字元。

如果你同時指定 -b 這個選項, sqlcmd 會以錯誤方式退出。 這個 -b 選項在本文 其他地方 都有說明。

-Q "命令行查詢"

啟動 sqlcmd 時執行查詢,然後立即結束 sqlcmd。 你可以執行多個用分號分隔的查詢。

請依照下列範例所示,利用引號來括住查詢。

在命令提示字元中,輸入:

sqlcmd -d AdventureWorks2025 -Q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"
sqlcmd -d AdventureWorks2025 -Q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
sqlcmd -d AdventureWorks2025 -Q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"
sqlcmd -d AdventureWorks2025 -Q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
sqlcmd -d AdventureWorks2025 -Q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"
sqlcmd -d AdventureWorks2025 -Q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"

Important

請勿在查詢中使用 GO 結束字元。

如果你同時指定 -b 這個選項, sqlcmd 會以錯誤方式退出。 這個 -b 選項在本文 其他地方 都有說明。

-T query_timeout

指定命令 (或 Transact-SQL 陳述式) 逾時之前的秒數。此選項會設定 sqlcmd 指令碼變數 SQLCMDSTATTIMEOUT。 如果你沒有指定 query_timeout 值,指令不會逾時。 query_timeout 必須是介於 165534之間的一個數字。 如果你提供的值不是數字或不在那個範圍內, sqlcmd 就會產生錯誤。

Note

實際逾時值可能與指定的 query_timeout 值相差數秒。

-v var = value [ var = value... ]

適用於:僅限 Windows。 不支援 Linux 和 macOS。

建立一個用於 sqlcmd 腳本的 sqlcmd 腳本變數。

如果值包含空格,請用引號括住該值。 您可以指定多個 <var>="<value>" 值。 如果你指定的值中有錯誤, sqlcmd 會產生錯誤訊息然後退出。

sqlcmd -v MyVar1=something MyVar2="some thing"
sqlcmd -v MyVar1=something -v MyVar2="some thing"
sqlcmd -v MyVar1=something MyVar2="some thing"
sqlcmd -v MyVar1=something -v MyVar2="some thing"
sqlcmd -v MyVar1=something MyVar2="some thing"
sqlcmd -v MyVar1=something -v MyVar2="some thing"

-x

sqlcmd 忽略指令碼變數。 當文稿包含許多 INSERT 語句時,此參數很有用,這些語句可能包含與一般變數具有相同格式的字串,例如 $(<variable_name>)

格式選項

-h 標頭

指定要在欄位標題之間列印的列數。" 預設設定會為每組查詢結果列印一次標題。 此選項會設定 sqlcmd 指令碼變數 SQLCMDHEADERS。 用 -1 來指定標頭不會被列印出來。 若值無效, sqlcmd 會產生錯誤訊息並退出。

-k [1 | 2]

從輸出中移除所有控制字符,如制表符和換行符。 此參數會在資料傳回時,保留資料行的格式。

  • -k 會移除控制字元。
  • -k1 會將每個控制字元取代為空格。
  • -k2 會將連續控制字元取代為單一空格。

-s col_separator

指定欄位分隔字元。 預設值是空格。 此選項會設定 sqlcmd 指令碼變數 SQLCMDCOLSEP。 若要使用對作業系統有特殊意義的字元,如連字號 (&) 或分號 (;),請用引號 (") 括住該字元。 欄位分隔符可以是任何 8 位元字元。

-W screen_width

指定輸出的螢幕寬度。 此選項會設定 sqlcmd 指令碼變數 SQLCMDCOLWIDTH。 資料行寬度必須是大於 8 且小於 65536 的數字。 如果指定的資料行寬度不在該範圍內,sqlcmd 會產生錯誤訊息。 預設寬度是 80 個字元。 當一行輸出超出指定的欄寬時,該行會自動換行到下一行。

-W

移除欄位的後方空格。 當準備要匯出到其他應用程式的資料時,請同時使用這個選項與 -s 選項。 不能與 -y-Y 選項搭配使用。

-Y variable_length_type_display_width

設定 sqlcmd 指令碼變數 SQLCMDMAXVARTYPEWIDTH。 預設值是 256。 這會限制大型可變長度資料類型的傳回字元數:

  • varchar(max)
  • nvarchar(max)
  • varbinary(max)
  • xml
  • 使用者定義資料類型 (UDT)
  • text
  • ntext
  • image

UDT 可以是固定長度,這會隨著實作情況而不同。 如果固定長度的UDT長度比 display_width短,回傳的UDT值不會受到影響。 不過,如果長度超出 display_width,便會截斷輸出。

Caution

請謹慎使用-y 0選項,因為它可能會根據傳回的數據大小,在伺服器和網路上造成顯著的效能問題。

-Y 固定長度型別顯示寬度

設定 sqlcmd 指令碼變數 SQLCMDMAXFIXEDTYPEWIDTH。 預設值為 0 (無限)。 限制針對下列資料類型傳回的字元數:

  • char(n),其中 1 <= n<= 8000
  • nchar(n),其中 1 <= n<= 4000
  • varchar(n),其中 1 <= n<= 8000
  • nvarchar(n),其中 1 <= n<= 4000
  • varbinary(n),其中 1 <= n<= 4000
  • sql_variant

錯誤報告選項

-b

指定在發生錯誤時,sqlcmd 會結束作業並傳回 DOS ERRORLEVEL 值。 當 SQL Server 錯誤訊息嚴重度等級超過 10 時, sqlcmd 回傳給變 ERRORLEVEL1 的值。 否則,回傳的值為 0。 如果你設定了 -V 這個選項,除了 -bsqlcmd 在嚴重程度低於該 -V 選項設定的值時,不會回報錯誤。 命令提示字元批次檔案可以測試 ERRORLEVEL 的值,而且能夠適當地處理錯誤。 sqlcmd 不會報告嚴重性層級 10 (資訊訊息) 的錯誤。

如果 sqlcmd 指令碼包含不正確的命令、語法錯誤,或遺漏指令碼變數,則傳回的 ERRORLEVEL 便是 1

-我 error_level

控制哪些錯誤訊息會傳送至stdoutSQLcmd 發送的訊息嚴重程度等級大於或等於此等級。 當你將此值設為 -1時, sqlcmd 會傳送所有訊息,包括資訊訊息。 不要在-m-1之間插入空格。 例如,-m-1 為有效,而 -m -1 為無效。

這個選項也會設定 sqlcmd 指令碼變數 SQLCMDERRORLEVEL。 這個變數具有預設值 0

-V error_severity_level(錯誤嚴重性層級)

控制 sqlcmd 用來設定 ERRORLEVEL 變數的嚴重程度等級。 嚴重性等級大於或等於此值的錯誤訊息將會被設定 ERRORLEVEL。 小於 0 的值會回報成 0。 你可以用批次和 CMD 檔案來測試變數的 ERRORLEVEL 值。

其他選項

-packet_size

要求一個不同大小的封包。 此選項會設定 sqlcmd 指令碼變數 SQLCMDPACKETSIZEpacket_size 必須是介於 51232767 之間的值。 預設值為 4096。 較大的封包大小能提升執行指令間 GO 多重 Transact-SQL 語句的腳本效能。 您可以要求較大的封包。 但是,若要求遭到拒絕, sqlcmd 便會使用伺服器預設的封包大小。

-C batch_terminator

指定批次終止符。 預設情況下,你必須終止指令,並用單行的字 GO ,接著按 Enter 鍵將指令傳送到 SQL Server。 當您重置批處理終止符時,即使在前面加了反斜線也不要使用 Transact-SQL 的保留關鍵字或對作業系統具有特殊意義的字元。

-L[c]

適用於:僅限 Windows。 不支援 Linux 和 macOS。

列出設在本機上的伺服器電腦,以及在網路中進行廣播的伺服器電腦名稱。 你不能把這個參數和其他參數一起使用。 最多可列出的伺服器電腦數量為 3,000 台。 若伺服器清單因緩衝區大小而被截斷,會顯示警告訊息。

Note

由於網路上廣播的性質,sqlcmd 可能不會收到來自所有伺服器的及時回應。 因此,傳回的伺服器清單可能會因這個選項的每個調用而有所不同。

如果您指定可選參數 c,輸出結果將不顯示 Servers: 標頭行,且每個伺服器行的開頭不會有空格。 這種呈現方式稱為乾淨輸出。 乾淨的輸出可以增進指令碼語言的處理效能。

-p[1]

列印每個結果集的效能統計資料。 以下顯示的是效能統計資料的格式範例:

Network packet size (bytes): n

x xact[s]:

Clock Time (ms.): total       t1  avg       t2 (t3 xacts per sec.)

Where:

  • x = SQL Server 所處理的交易數目。
  • t1 = 所有交易的總時間。
  • t2 = 單一交易的平均時間。
  • t3 = 每秒的平均交易數。

所有時間都以毫秒表示。

如果你指定可選參數 1,統計數據的輸出格式是冒號分隔格式,可以輕易匯入試算表或由腳本處理。

如果你將可選參數指定為除 1之外的任何值,就會產生錯誤, sqlcmd 會退出。

-X[1]

停用從批次檔執行 sqlcmd 時,可能會危及系統安全性的命令。 仍會辨識停用的命令; sqlcmd 會發出一則警告訊息,並繼續作業。 如果你指定可選參數 1sqlcmd 會產生錯誤訊息然後退出。 使用 -X 選項時,會停用下列命令:

  • ED
  • !!

如果你指定這個選項, -X 它會阻止環境變數傳給 sqlcmd。 也無法執行利用 SQLCMDINI 指令碼變數所指定的啟動指令碼。 如需有關 sqlcmd 指令碼變數的詳細資訊,請參閱 sqlcmd - 搭配指令碼變數使用

-?

顯示 sqlcmd 的版本和 sqlcmd 選項的語法摘要。

Note

在 macOS 上,改為執行 sqlcmd '-?' (帶引號)。

Remarks

你不必按照語法區塊顯示的順序使用選項。

Note

如果您使用 -i 選項後面接著一或多個額外的參數,則必須使用 參數與值之間的空格。 這個要求在 sqlcmd (Go)中是已知的問題。

SQL CMD 會在批次中列印多個結果集之間的空白行。 此外, <x> rows affected 當訊息不適用於運行中的語句時,也不會顯示。

若要以互動方式使用 sqlcmd,請在命令提示字元處鍵入 sqlcmd,並指定本文稍早所述的一或多個選項。 如需詳細資訊,請參閱 使用 sqlcmd

Note

-l選項 、 -Q-Z, 或 -i 會讓 sqlcmd 在執行後退出。

底層作業系統決定命令環境中 sqlcmd 命令列的總長度(例如, cmd.exebash),包含所有參數與展開變數。

sqlcmd 和 bcp 中的 DSN 支援

如果您指定 ,您可以在 bcp -Ssqlcmd :Connect 選項 (或 -D 命令) 中指定資料來源名稱 (DSN),而不是伺服器名稱。 如果你用這個 -D 選項, sqlcmdbcp 會連接到 DSN 中該 -S 選項指定的伺服器。

系統 DSN 會儲存在 ODBC odbc.ini 目錄中的 SysConfigDir 檔案(在標準安裝中為 /etc/odbc.ini)。 使用者 DSN 會儲存在 .odbc.ini 使用者的主目錄中 (~/.odbc.ini)。

在 Windows 系統上,系統與使用者 DSN 會儲存在登錄中,並透過 odbcad32.exe進行管理。 bcpsqlcmd 不支援檔案 DSN。

關於驅動程式支援的條目清單,請參見 DSN 與 Connection String 關鍵字與屬性

在 DSN 中,只需要輸入 DRIVER 即可。 要連接遠端伺服器, sqlcmdbcp 需要在元素中 SERVER 設定一個值。 若元素 SERVER 為空或不存在於 DSN 中, sqlcmdbcp 會嘗試連接本地系統的預設實例。

當您在 Windows 系統上使用 bcp 時,SQL Server 2017 (14.x) 和舊版需要 SQL Native Client 11 驅動程式 (sqlncli11.dll),而 SQL Server 2019 (15.x) 和更新版本需要 MICROSOFT ODBC Driver 17 for SQL Server 驅動程式 (msodbcsql17.dll)。

如果你在 DSN 和 sqlcmdbcp 命令列都指定相同的選項,命令列選項會覆蓋 DSN 中使用的值。 例如,如果 DSN 有 DATABASE 項目且 sqlcmd 命令列包含 -d,則會使用傳遞至 -d 的值。 如果您在 DSN 中指定 Trusted_Connection=yes ,則使用 Kerberos 認證;若提供使用者名稱(-U)與密碼(-P),則忽略。

你可以透過定義以下別名來修改現有呼叫isql腳本以使用sqlcmdalias isql="sqlcmd -D"

sqlcmd 最佳做法

請採用以下做法,以最大化安全性與效率:

  • 使用整合式安全性。

  • 在自動化環境中使用 -X[1]

  • 使用適當的檔案系統權限保護輸入檔和輸出檔。

  • 為了提升效能,盡量在一個 sqlcmd 會話中完成所有工作,而不是使用一系列的會話。

  • 將批次或查詢執行的逾時值設為高於預期執行時間的值。

使用下列作法以協助將正確性最大化:

  • 使用 -V 16 來記錄任何嚴重性16級別訊息。 嚴重度16的訊息表示一般錯誤,你可以修正。

  • 檢查進程結束之後的結束代碼和 DOS ERRORLEVEL 變數。 SQLCMD 會正常回傳 0 。 否則,將依照-V所設定來設定ERRORLEVEL。 換句話說,不要期待 ERRORLEVEL 它會和 SQL Server 回報的錯誤號碼相同。 錯誤號碼是對應至系統函 式@@ERROR的 SQL Server 特定值。 ERRORLEVELSQL CMD 專用的值,用以指示 SQLCMD 終止的原因。 其值會受到參數指定 -b 的影響。

使用 -V 16 搭配檢查結束代碼與 DOS ERRORLEVEL,可以幫助在自動化環境中捕捉錯誤,特別是在生產發布前的品質關卡中。