使用 sqlcmd 連接

下載 ODBC 驅動程式

sqlcmd 公用程式隨附於 Linux 和 macOS 上的 Microsoft ODBC Driver for SQL Server 中。

下列命令分別說明如何使用 Windows 驗證 (Kerberos) 和 SQL Server 驗證:

sqlcmd -E -Sxxx.xxx.xxx.xxx
sqlcmd -Sxxx.xxx.xxx.xxx -Uxxx -Pxxx

可用選項

Linux 和 macOS 上的 sqlcmd 提供下列選項:

-?
顯示 sqlcmd 使用方式。

-a
要求封包大小。

-b
如果有錯誤,則終止批次工作。

-cbatch_terminator
指定批次結束字元。

-C
信任伺服器憑證。

-ddatabase_name
在您啟動 sqlcmd 時發出 USEdatabase_name 陳述式。

-D
使傳遞至 sqlcmd -S 選項的值解譯為資料來源名稱 (DSN)。 如需詳細資訊,請參閱本文結尾處的<sqlcmdbcp 中的 DSN 支援>。

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

-E
使用信任連接 (整合式驗證)。如需有關如何從 Linux 或 macOS 用戶端建立使用整合式驗證的信任連接的詳細資訊,請參閱使用整合式驗證

-fcodepage | i:codepage[,o:codepage] | o:codepage[,i:codepage]
指定輸入和輸出字碼頁。 字碼頁碼是一個數值,指定已安裝的 Linux 字碼頁。 (自 17.5.1.1 起提供)

-G
這個參數在連線到 Azure SQL Database、Azure SQL 受控執行個體或 Azure Synapse Analytics 時由用戶端使用,以指定使用 Microsoft Entra ID (前身為 Azure Active Directory) 驗證來驗證使用者。 其只能搭配 -P 選項以使用存取權杖驗證 (v17.8+)。 這個選項會設定 sqlcmd 指令碼變數 SQLCMDUSEAAD = true。 -G 參數至少需要 sqlcmd 17.6 版。 若要判斷您的版本,請執行 sqlcmd -?

重要

-G 選項僅適用 Azure SQL Database、Azure SQL 受控執行個體與 Azure Synapse Analytics。

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

-hnumber_of_rows
指定資料行標頭之間所要列印的資料列數。

-H
指定工作站名稱。

-iinput_file[,input_file[,...]]
識別包含 SQL 陳述式或預存程序之批次的檔案。

-I
SET QUOTED_IDENTIFIER 連接選項設為 [開啟]。

-k
移除或取代控制字元。

-Kapplication_intent
宣告連接到伺服器時的應用程式工作負載類型。 目前唯一支援的值是 ReadOnly。 若未指定 -Ksqlcmd 即不支援對 AlwaysOn 可用性群組中的次要複本進行連線。 如需詳細資訊,請參閱 Linux 和 macOS 上的 ODBC 驅動程式 - 高可用性和災害復原

注意

CTP for SUSE Linux 不支援 -K。 不過,您可以在傳遞至 sqlcmd 的 DSN 檔案中指定 ApplicationIntent=ReadOnly 關鍵字。 如需詳細資訊,請參閱本文結尾處的<sqlcmdbcp 中的 DSN 支援>。

-ltimeout
選項會指定在您嘗試連線到伺服器時,sqlcmd 登入的逾時秒數。

-merror_level
控制哪些錯誤訊息會傳送至 stdout。

-Mmultisubnet_failover
在連線到 SQL Server 2012 (11.x) 可用性群組的可用性群組接聽程式或 SQL Server 2012 (11.x) 容錯移轉叢集執行個體時,一律指定 -M-M 可提供對 (目前) 作用中伺服器更快速的容錯移轉偵測與連線。 如果未指定 -M,則會關閉 -M。 如需 Always On 可用性群組的詳細資訊,請參閱 Linux 和 macOS 上的 ODBC 驅動程式 - 高可用性和災害復原

注意

CTP for SUSE Linux 不支援 -M。 不過,您可以在傳遞至 sqlcmd 的 DSN 檔案中指定 MultiSubnetFailover=Yes 關鍵字。 如需詳細資訊,請參閱本文結尾處的<sqlcmdbcp 中的 DSN 支援>。

-N[s|m|o]
將連線加密模式分別設定為 [Strict]、[強制] 或 [選擇性]。 如果未指定,則預設為 [強制]。 ([s|m|o] 已新增至 sqlcmd 18.0 中)

-ooutput_file
識別從 sqlcmd 接收輸出的檔案。

-p
列印每個結果集的效能統計資料。

-P
指定使用者密碼。 搭配不含 -U 的 -G 選項使用時,指定包含存取權杖的檔案 (v17.8+)。 權杖檔案應為 UTF-16LE (非 BOM) 格式。

您可以透過各種方法取得存取權杖。 請務必確保存取權杖的每個位元組都正確無誤,因為其會依原樣傳送。 以下是取得存取權杖的範例命令。 此命令會使用 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

-qcommandline_query
sqlcmd 啟動時執行查詢,但查詢結束執行後不要退出。

-Qcommandline_query
sqlcmd 啟動時執行查詢。 查詢完成時就會結束 sqlcmd

-r
將錯誤訊息重新導向至 stderr。

-R
使驅動程式使用用戶端的地區設定,將貨幣、日期和時間資料轉換成字元資料。 目前僅使用 en_US (美式英文) 格式。

-scolumn_separator_char
指定資料行分隔字元。

-S [protocol:] server[,port]
指定要連接的 SQL Server 執行個體;如果使用 -D,則指定 DSN。 Linux 和 macOS 上的 ODBC 驅動程式需要使用 -S。 唯一有效的通訊協定值是 tcp

-tquery_timeout
指定命令 (或 SQL 陳述式) 逾時之前的秒數。

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

-U
login_id 指定使用者登入識別碼。

-Verror_severity_level
控制用來設定 ERRORLEVEL 變數的嚴重性層級。

-wcolumn_width
指定輸出的螢幕寬度。

-W
從資料行中移除尾端空格。

-x
停用變數替代。

-X
停用命令、啟動指令碼和環境變數。

-yvariable_length_type_display_width
設定 sqlcmd 指令碼變數 SQLCMDMAXFIXEDTYPEWIDTH

-Yfixed_length_type_display_width
設定 sqlcmd 指令碼變數 SQLCMDMAXVARTYPEWIDTH

-zpassword
變更密碼。

-Zpassword
變更密碼並結束。

可用的命令

在目前版本中,有下列命令可供使用:

  • [:]!!

  • :Connect

  • :Error

  • [:]EXIT

  • GO [count]

  • :Help

  • :List

  • :Listvar

  • :On Error

  • :Out

  • :Perftrace

  • [:]QUIT

  • :r

  • :RESET

  • :setvar

無法使用的選項

在目前版本中,下列選項無法使用:

-A
使用專用管理員連接 (DAC) 來登入 SQL Server。 如需如何建立專用管理員連線 (DAC) 的資訊,請參閱程式設計指導方針

-L
列出設定在本機的伺服器電腦,以及在網路中進行廣播的伺服器電腦名稱。

-v
建立 sqlcmd 指令碼中所能使用的 sqlcmd 指令碼變數。

您可以使用下列替代方法:將參數放在一個檔案中,然後再附加至另一個檔案。 這個方法將可協助您使用參數檔案來取代值。 例如,建立稱為 a.sql (參數檔案) 且具有下列內容的檔案:

:setvar ColumnName object_id
:setvar TableName sys.objects

然後,建立稱為 b.sql 的檔案,內含要取代的參數:

SELECT $(ColumnName) FROM $(TableName)

在命令列上使用下列命令,將 a.sqlb.sql 結合為 c.sql

cat a.sql > c.sql

cat b.sql >> c.sql

執行 sqlcmd 並使用 c.sql 作為輸入檔案:

sqlcmd -S<...> -P<..> -U<..> -I c.sql

無法使用的命令

在目前版本中,下列命令無法使用:

  • :ED

  • :ServerList

  • :XML

sqlcmd 和 bcp 中的 DSN 支援

如果指定 -D,則可在 sqlcmdbcp-S 選項 (或 sqlcmd :Connect 命令) 中指定資料來源名稱 (DSN),而不是伺服器名稱。 -D 會使 sqlcmdbcp 連線到 -S 選項在 DSN 中指定的伺服器。

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

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

如需驅動程式支援的項目清單,請參閱 DSN 與連接字串關鍵字和屬性

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"

另請參閱

連接 bcp
版本資訊