[转帖]Sqlcmd使用详解
Sqlcmd使用詳解
2018年09月17日 13:36:39?吥輕誩放棄?閱讀數:3053 版權聲明:版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/sandy9919/article/details/82735755Sqlcmd實用工具,可以輸入 TRANSACT-SQL 語句、 系統過程和腳本文件,通過各種可用模式:
- 通過命令提示符。
- 在中查詢編輯器在 SQLCMD 模式下。
- 在 Windows 腳本文件。
- 在 SQL Server 代理作業的操作系統 (Cmd.exe) 作業步驟。
該實用工具使用 ODBC 執行 TRANSACT-SQL 批處理。
備注
Sqlcmd 實用工具的最新版本可作為 Web 版本從?下載中心獲取。?您需要版本 13.1 或更高版本以支持 Always Encrypted (-g) 和 Azure Active Directory 身份驗證 (-G)。?(你的計算機上可能已安裝多個版本的 sqlcmd.exe。?請確保使用正確的版本。?若要確定版本,請執行?sqlcmd -?。)
預安裝默認情況下,可以嘗試從 Azure Cloud Shell sqlcmd 實用工具:?
若要在 SSMS 中運行 sqlcmd 語句,請從頂部導航欄上的“查詢菜單”下拉列表中選擇“SQLCMD 模式”。
重要
在“查詢編輯器”的常規模式和 SQLCMD 模式下,?SQL Server Management Studio?(SSMS) 使用 Microsoft?.NET Framework?SqlClient 執行操作。?通過命令行運行 sqlcmd 時,sqlcmd 使用 ODBC 驅動程序。?由于可以應用不同的默認選項,因此在?SQL Server Management Studio?SQLCMD 模式下以及在?sqlcmd?實用工具中執行相同的查詢時,可能會看到不同的行為。
sqlcmd 暫不要求命令行選項和值之間必須有空格。?不過,在今后推出的版本中,可能會要求在命令行選項和值之間必須有空格。
其他主題:
- 啟動 sqlcmd 實用工具
- 使用 sqlcmd 實用工具
語法
復制
命令行選項
登錄相關選項
-A
使用專用管理員連接 (DAC) 登錄 SQL Server。?此類型連接用于排除服務器故障。?此連接僅適用于支持 DAC 的服務器計算機。?如果 DAC 不可用,sqlcmd 會生成錯誤消息并退出。?有關 DAC 的詳細信息,請參閱?用于數據庫管理員的診斷連接。?-A 選項不支持使用-G 選項。?當連接到 SQL 數據庫使用-A,您必須是 SQL server 管理員。?DAC 不可用的 Azure Active Directory 管理員。
-C
該開關供客戶端用于將其配置為隱式表示信任服務器證書且無需驗證。?此選項等同于 ADO.NET 選項?TRUSTSERVERCERTIFICATE = true。
-d?db_name
啟動?sqlcmd?時發出一個?USE?db_name?語句。?此選項設置?sqlcmd?腳本變量 SQLCMDDBNAME。?此參數指定初始數據庫。?默認為您的登錄名的默認數據庫屬性。?如果數據庫不存在,則生成錯誤消息且?sqlcmd退出。
-l?login_timeout
指定在你嘗試連接到服務器時?sqlcmd?登錄 ODBC 驅動程序的超時時間(以秒為單位)。?此選項設置?sqlcmd?腳本變量 SQLCMDLOGINTIMEOUT。?登錄到?sqlcmd?的默認超時時間為 8 秒。?當使用?-G?選項連接到 SQL 數據庫或 SQL 數據倉庫并使用 Azure Active Directory 進行身份驗證時,建議超時值至少為 30 秒。?登錄超時必須是介于 0 和 65534 之間的數字。?如果提供的值不是數值或不在此范圍內,?sqlcmd?將生成錯誤消息。?該值為 0 時,則允許無限制等待。
-E
使用信任連接而不是用戶名和密碼登錄 SQL Server。?默認情況下,如果未指定?-E?,?sqlcmd?將使用信任連接選項。
-E?選項會忽略可能的用戶名和密碼環境變量設置,例如 SQLCMDPASSWORD。?如果將?-E?選項與?-U?選項或?-P?選項一起使用,將生成錯誤消息。
-g
將列加密設置設為?Enabled。?有關詳細信息,請參閱?Always Encrypted。?僅支持存儲在 Windows 證書存儲中的主密鑰。?-g 開關至少需要?sqlcmd?版本?13.1。?若要確定你的版本,請執行?sqlcmd -?。
-G
當連接到 SQL 數據庫或 SQL 數據倉庫時,客戶端將使用此開關指定該用戶使用 Azure Active Directory 身份驗證來進行身份驗證。?此選項設置?sqlcmd?腳本變量 SQLCMDUSEAAD = true。?-G 開關至少需要?sqlcmd?版本?13.1。?若要確定你的版本,請執行?sqlcmd -?。?有關詳細信息,請參閱?使用 Azure Active Directory 身份驗證連接到 SQL 數據庫或 SQL 數據倉庫。?-A 選項不支持使用-G 選項。
重要
-G?選項僅適用于 Azure SQL 數據庫 和 Azure 數據倉庫。
-
Azure Active Directory 用戶名和密碼:
當你想要使用 Azure Active Directory 用戶名和密碼時,可以提供?-G?選項,也可以通過提供?-U?選項和?-P?選項來使用用戶名和密碼。
復制
Sqlcmd -S testsrv.database.windows.net -d Target_DB_or_DW -U bob@contoso.com -P MyAADPassword -G-G 參數在后端生成以下連接字符串:
復制
SERVER = Target_DB_or_DW.testsrv.database.windows.net;UID= bob -
Azure Active Directory 集成
要進行 Azure Active Directory 集成身份驗證,可提供?-G?選項而無需用戶名或密碼:
復制
Sqlcmd -S Target_DB_or_DW.testsrv.database.windows.net -G這將在后端生成以下連接字符串:
復制
SERVER = Target_DB_or_DW.testsrv.database.windows.net Authentication = ActiveDirectoryIntegrated; Trusted_Connection=NO備注
-E 選項 (Trusted_Connection) 不能與 -G 選項一起使用。
-H?workstation_name
工作站的名稱。?此選項設置?sqlcmd?腳本變量 SQLCMDWORKSTATION。?工作站名稱列出在?sys.sysprocesses?目錄視圖的?hostname?列中,并且可使用存儲過程?sp_who返回。?如果不指定此選項,則默認為當前計算機名稱。?此名稱可用來標識不同的?sqlcmd?會話。
-j?將原始錯誤消息輸出到銀幕上。
-K?application_intent
連接到服務器時聲明應用程序工作負荷類型。?目前唯一支持的值是?ReadOnly。?如果未指定?-K?,sqlcmd 實用工具將不支持連接到 AlwaysOn 可用性組中的次要副本。?有關詳細信息,請參閱活動次要副本:可讀次要副本(AlwaysOn 可用性組)
-M?multisubnet_failover
在連接到 SQL Server 可用性組或 SQL Server 故障轉移群集實例的可用性組偵聽程序時,應始終指定 -M。-M?將為(當前)活動服務器提供更快的檢測和連接。?如果不指定?–M?,則?-M?處于關閉狀態。?有關詳細信息 [!包括ssHADR,創建和配置的可用性組的(SQL Server),故障轉移群集和 Alwayson 可用性組 (SQL Server),并活動次要副本: 可讀次要副本 (Alwayson 可用性組)。
-N
此開關供客戶端用于請求加密連接。
-P?password
用戶指定的密碼。?密碼是區分大小寫的。?如果使用了 -U 選項而未使用?-P?選項,并且未設置?SQLCMDPASSWORD?環境變量,則 sqlcmd 會提示用戶輸入密碼。?我們不建議使用 null 密碼,但您可以通過連續雙引號一對用于參數值指定 null 密碼:
- -P ""
建議使用強密碼。
使用強密碼!
通過向控制臺輸出密碼提示,可以顯示密碼提示,如下所示:?Password:
隱藏用戶輸入。?也就是說,將不會顯示任何輸入的內容,光標保留原位不動。
使用 SQLCMDPASSWORD 環境變量可以為當前會話設置默認密碼。?因此,不必將密碼硬編碼到批處理文件中。
以下示例首先在命令提示符處設置 SQLCMDPASSWORD 變量,然后訪問?sqlcmd?實用工具。?在命令提示符下,鍵入:
SET SQLCMDPASSWORD= p@a$$w0rd
在以下命令提示符處鍵入:
sqlcmd
如果用戶名和密碼組合不正確,將生成錯誤消息。
注意!?為實現向后兼容性而保留了 OSQLPASSWORD 環境變量。?SQLCMDPASSWORD 環境變量優先于 OSQLPASSWORD 環境變量。?現在,不再共享 OSQLPASSWORD,實用程序sqlcmd并osql可以彼此不受干擾地使用。?舊腳本將繼續使用。
如果將?-P?選項與?-E?選項一起使用,將生成錯誤消息。
如果?-P?選項后有多個參數,將生成錯誤消息并退出程序。
-S?[協議:]server[\instance_name] [,*?*端口]
指定要連接的 SQL Server 實例。?它設置?sqlcmd?腳本變量 SQLCMDSERVER。
指定 server_name 可連接到該服務器計算機上的 SQL Server 默認實例。?指定要連接到該服務器計算機上 SQL Server 命名實例的 server_name [ \instance_name ]。?如果不指定服務器,sqlcmd 將連接到本地計算機上 SQL Server 的默認實例。?從網絡上的遠程計算機執行?sqlcmd?時,此選項是必需的。
protocol?可以是?tcp?(TCP/IP)、?lpc?(共享內存)或?np?(命名管道)。
如果在啟動 sqlcmd 時未指定 server_name [ \instance_name ],SQL Server 將檢查并使用 SQLCMDSERVER 環境變量。
備注
為實現向后兼容性而保留了 OSQLSERVER 環境變量。?SQLCMDSERVER 環境變量優先于 OSQLSERVER 環境變量;也就是說?sqlcmd?和?osql?可以彼此相鄰使用而不會相互干擾,并且舊式腳本可以繼續使用。
-U?login_id
登錄名或包含的數據庫用戶名。?對于包含的數據庫用戶,必須提供數據庫名稱選項 (-d)。
備注
OSQLUSER 環境變量可用于實現向后兼容性。?SQLCMDUSER 環境變量優先于 OSQLUSER 環境變量。也就是說,?sqlcmd?和?osql?可以彼此相鄰使用而不會相互干擾。?此外,現有的?osql?腳本可以繼續使用。
如果 -U 選項和 -P 選項均未指定,sqlcmd 將嘗試使用 Microsoft Windows 身份驗證模式進行連接。?身份驗證基于運行?sqlcmd的用戶的 Windows 帳戶。
如果?-U?選項與?-E?選項(將在本主題的后面進行說明)一起使用,則會生成錯誤消息。?如果?–U?選項后有多個參數,將生成錯誤消息并退出程序。
-z?new_password
更改密碼:
sqlcmd -U someuser -P s0mep@ssword -z a_new_p@a$$w0rd
-Z?new_password
更改密碼并退出:
sqlcmd -U someuser -P s0mep@ssword -Z a_new_p@a$$w0rd
輸入/輸出選項
-f?codepage?|?i:codepage[,o:codepage] |?o:codepage[,i:* codepage]
指定輸入和輸出代碼頁。?代碼頁頁碼是指定已安裝的 Windows 代碼頁的數值。
代碼頁轉換規則:
-
如果未指定代碼頁,?sqlcmd?會將當前代碼頁同時用于輸入文件和輸出文件,除非輸入文件為 Unicode 文件,在此情況下無需進行轉換。
-
sqlcmd?自動識別 Big-endian Unicode 和 Little-endian Unicode 輸入文件。?如果已指定?-u?選項,輸出將始終為 Little-endian Unicode。
-
如果未指定輸出文件,輸出代碼頁將為控制臺代碼頁。?借助此方法,可以在控制臺上正確顯示輸出。
-
假定多個輸入文件具有相同的代碼頁。?可以將 Unicode 和非 Unicode 輸入文件混合在一起。
在命令提示符處輸入?chcp?以驗證 Cmd.exe 的代碼頁。
-i?input_file[,* * * input_file2*...]
標識包含一批 SQL 語句或存儲過程的文件。?可以指定要按順序讀取和處理的多個文件。?文件名之間不要使用任何空格。?sqlcmd?將首先檢查所有指定的文件是否都存在。?如果有一個或多個文件不存在,?sqlcmd?將退出。?-i 和 -Q/-q 選項是互斥的。路徑示例:
復制
包含空格的文件路徑必須用引號引起來。
此選項可以多次使用:-iinput_file?-II input_file.
-o?output_file
標識從?sqlcmd接收輸出的文件。
如果指定了?-u?,則?output_file?以 Unicode 格式存儲。?如果文件名無效,將生成一個錯誤消息,并且sqlcmd?將退出。?sqlcmd?不支持向同一文件并發寫入多個?sqlcmd?進程。?文件輸出將損壞或不正確。?請參閱?-f開關也是與文件格式。?如果此文件不存在,將創建此文件。?前一個?sqlcmd?會話中的同名文件將被覆蓋。?此處指定的文件不是?stdout?文件。?如果指定了 stdout 文件,就不會使用此文件。
路徑示例:
復制
包含空格的文件路徑必須用引號引起來。
-r[0?|?1]
將錯誤消息輸出重定向到屏幕 (stderr)。?如果未指定參數或指定參數為?0,則僅重定向嚴重級別為 11 或更高的錯誤消息。?如果指定參數為?1,則將重定向所有消息輸出(包括 PRINT)。?如果使用 -o,將不起任何作用。?默認情況下,消息將發送到?stdout。
-R
促使 sqlcmd 根據客戶端的區域設置本地化從 SQL Server 中檢索到的數字、貨幣、日期和時間列。?默認情況下,將使用服務器的區域設置顯示這些列。
-u
指定無論?input_file?為何種格式,都以 Unicode 格式存儲?output_file。
查詢執行選項
-e
將輸入腳本寫入標準輸出設備 (stdout)。
-I
將 SET QUOTED_IDENTIFIER 連接選項設置為 ON。?默認情況下,此選項設置為 OFF。?有關詳細信息,請參閱?SET QUOTED_IDENTIFIER (Transact-SQL)。
-q"?cmdline query?"
啟動?sqlcmd?時執行查詢,但是在查詢結束運行時不退出?sqlcmd?。?可以執行多個以分號分隔的查詢。?將查詢用引號引起來,如下例所示。
在命令提示符下,鍵入:
sqlcmd -d AdventureWorks2012 -q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"
sqlcmd -d AdventureWorks2012 -q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
重要
請不要在查詢中使用 GO 終止符。
如果在指定此選項的同時還指定了?-b?,?sqlcmd?在遇到錯誤時將退出。?-b?將在本主題后面部分進行介紹。
-Q"?cmdline query?"
在?sqlcmd?啟動時執行查詢,隨后立即退出?sqlcmd。?可以執行多個以分號分隔的查詢。
將查詢用引號引起來,如下例所示。
在命令提示符下,鍵入:
sqlcmd -d AdventureWorks2012 -Q "SELECT FirstName, LastName FROM Person.Person WHERE LastName LIKE 'Whi%';"
sqlcmd -d AdventureWorks2012 -Q "SELECT TOP 5 FirstName FROM Person.Person;SELECT TOP 5 LastName FROM Person.Person;"
重要
請不要在查詢中使用 GO 終止符。
如果在指定此選項的同時還指定了?-b?,?sqlcmd?在遇到錯誤時將退出。?-b?將在本主題后面部分進行介紹。
-t?query_timeout
指定命令(或 SQL 語句)超時的時間。此選項設置?sqlcmd?腳本變量 SQLCMDSTATTIMEOUT。?如果未指定?time_out?值,則命令將不會超時。querytime_out 必須是介于 1 和 65534 之間的數字。?如果提供的值不是數值或不在此范圍內,?sqlcmd?將生成錯誤消息。
備注
實際的超時值可能會與指定的 time_out 值相差幾秒。
-vvar =?value[?var =?value...]
創建可在?sqlcmd腳本中使用的?sqlcmd?腳本變量。?如果該值包含空格,則將其用引號引起來。?可以指定多個 var="values" 值*。?如果指定的任何值中有錯誤,?sqlcmd?會生成錯誤消息,然后退出。
sqlcmd -v MyVar1=something MyVar2="some thing"
sqlcmd -v MyVar1=something -v MyVar2="some thing"
-x
導致?sqlcmd?忽略腳本變量。?如果腳本中包含多個 INSERT 語句,且這些語句可能包含格式與常規變量(如 $(variable_name))相同的字符串,就會發現此參數很有用。
格式設置選項
-h?headers
指定要在列標題之間輸出的行數。?默認為每一組查詢結果輸出一次標題。?此選項設置?sqlcmd?腳本變量 SQLCMDHEADERS。?使用?-1?指定不可輸出標題。?任何無效的值都將導致?sqlcmd?生成錯誤消息并隨后退出。
-k?[1?|?2]
刪除輸出中的所有控制字符,例如制表符和換行符。?此參數在返回數據時保留列格式。?如果指定了 1,則控制字符被一個空格替代。?如果指定了 2,則連續的控制字符被一個空格替代。?-k?與?-k1相同。
-s?col_separator
指定列分隔符字符。?默認為空格。?此選項設置?sqlcmd?腳本變量 SQLCMDCOLSEP。?若要使用對操作系統有特殊含義的字符,如“與”符號 (&) 或分號 (;),請將該字符用雙引號 (") 引起來。?列分隔符可以是任意 8 位字符。
-w?column_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
-
圖像
備注
根據實現,UDT 可以使用固定的長度。?如果此固定長度 UDT 的長度比?display_width短,則返回的 UDT 值將不受影響。?但是,如果此長度比?display_width長,則輸出會被截斷。
重要
使用?-y 0?選項時要特別注意,因為根據返回的數據量大小,此選項可能導致服務器和網絡上出現嚴重性能問題。
-Y?fixed_length_type_display_width
設置?sqlcmd?腳本變量?SQLCMDMAXFIXEDTYPEWIDTH。?默認值為 0(無限制)。?它限制為以下數據類型返回的字符數:
-
char(?n?),其中 1<=n<=8000
-
nchar(n?n?),其中 1<=n<=4000
-
varchar(n?n?),其中 1<=n<=8000
-
nvarchar(n?n?),其中 1<=n<=4000
-
varbinary(n?n?),其中 1<=n<=4000
-
變量
錯誤報告選項
-b
指定發生錯誤時,?sqlcmd?退出并返回一個 DOS ERRORLEVEL 值。?當 SQL Server 錯誤消息的嚴重級別高于 10 時,返回給 DOS ERRORLEVEL 變量的值為 1;否則返回的值為 0。?如果除?-b?選項外還設置了?-V選項,則當嚴重級別低于使用?-V?設置的值時,?sqlcmd將不報告錯誤。?命令提示符批處理文件可以測試 ERRORLEVEL 的值并相應處理錯誤。?sqlcmd?不對嚴重級別 10 報告錯誤(信息性消息)。如果?sqlcmd?腳本包含錯誤的注釋、語法錯誤或缺少腳本變量,則返回的 ERRORLEVEL 為 1。
-m?error_level
控制發送到?stdout的錯誤消息類型。?將發送嚴重級別大于或等于此級別的消息。?如果此值設置為?-1,將發送所有消息(包括信息性消息)。?-m?和?-1之間不允許有空格。?例如,?-m-1?有效,而?-m-1?無效。此選項還設置?sqlcmd?腳本變量 SQLCMDERRORLEVEL。?此變量的默認值為 0。
-b?error_severity_level
控制用于設置 ERRORLEVEL 變量的嚴重級別。?嚴重級別大于或等于此值的錯誤消息將設置 ERRORLEVEL。?小于 0 的值將報告為 0。?可以使用批處理文件和 CMD 文件來測試 ERRORLEVEL 變量的值。其他選項
-a?packet_size
需要不同大小的數據包。?此選項設置?sqlcmd?腳本變量 SQLCMDPACKETSIZE。?packet_size?必須是介于 512 和 32767 之間的值。?默認值為 4096。?如果腳本的兩個 GO 命令之間包含大量 SQL 語句,則使用較大的數據包可以提高腳本執行的性能。?您可以請求更大的包大小。?但是,如果請求遭拒絕,?sqlcmd?將對包大小使用服務器默認值。-c?batch_terminator
指定批處理終止符。?默認情況下,通過單獨在一行中鍵入“GO”來終止命令并將其發送到 SQL Server。?重置批處理終止符時,不要使用對操作系統具有特殊意義的 Transact-SQL 保留關鍵字或字符,即便它們前面有反斜杠也是如此。-L[c]
列出本地配置的服務器計算機和在網絡上播發的服務器計算機的名稱。?此參數不能與其他參數結合使用。?可以列出的服務器的最大數目是 3000。?如果服務器列表由于緩沖區大小而被截斷,則會顯示錯誤消息。
備注
鑒于網絡廣播的特點,?sqlcmd?不可能及時接收來自所有服務器的響應。?因此,每次調用該選項所返回的服務器列表都可能不同。
如果指定了可選參數 c,輸出就不會包含 Servers: 標題行,且列出的每個服務器行都沒有前導空格。?此演示文稿稱為清除輸出。?清除輸出可以提高腳本語言的處理性能。
-p[1]
輸出每個結果集的性能統計信息。?下面的輸出顯示示例展示了性能統計信息的格式:
Network packet size (bytes): n
x xact[s]:
Clock Time (ms.): total t1 avg t2 (t3 xacts per sec.)
其中:
x?= SQL Server 處理的事務數。
t1?= 所有事務的總時間。
t2?= 單個事務的平均時間。
t3?= 每秒平均事務數。
所有時間均以毫秒表示。
如果指定了可選參數?1?,則統計信息的輸出格式為以冒號分隔的格式,此格式可以由腳本輕松導入到電子表格中或進行處理。
如果可選參數是除?1之外的任何值,則將生成錯誤并且?sqlcmd?將退出。
-X[1]
從批處理文件執行?sqlcmd?時,將禁用可能危及系統安全的命令。?禁用的命令仍然可以被識別;?sqlcmd發出警告消息并繼續。?如果指定了可選參數?1?,則?sqlcmd?將生成錯誤消息,然后退出。?使用?-X?選項時,將禁用以下命令:
-
ED
-
!!?command
如果指定?-X?選項,則會阻止將環境變量傳遞給?sqlcmd。?同時該選項還會阻止執行通過使用 SQLCMDINI 腳本變量指定的啟動腳本。?有關?sqlcmd?腳本變量的詳細信息,請參閱?將 sqlcmd 與腳本變量結合使用。
-?
顯示?sqlcmd?的版本和?sqlcmd?選項的語法摘要。
Remarks
不必按語法部分所示的順序使用選項。
在返回多個結果時,?sqlcmd?在批處理中的每個結果集之間輸出一個空行。?此外,如果沒有應用于已執行的語句,則不會出現?<x> rows affected?消息。
若要交互使用?sqlcmd?,請在命令提示符處帶本主題前面介紹的一個或多個選項鍵入?sqlcmd?。?有關詳細信息,請參閱?使用 sqlcmd 實用工具
備注
選項?-L、?-Q、?-Z?或?-i?會導致?sqlcmd?在執行后退出。
命令環境 (Cmd.exe) 中的 sqlcmd 命令行的總長度(包括所有參數和擴展變量)取決于 Cmd.exe 所在的操作系統。
變量優先級(從低到高)
系統級環境變量。
用戶級環境變量
運行sqlcmd?之前在命令提示符處設置的命令 shell (?SETX=Y)。
sqlcmd-v?X=Y
:Setvar?X Y
備注
若要查看環境變量,請在“控制面板” 中打開“系統” ,然后單擊“高級” 選項卡。
sqlcmd 腳本變量
| SQLCMDUSER | -U | R | "" |
| SQLCMDPASSWORD | -P | -- | "" |
| SQLCMDSERVER | -S | R | "DefaultLocalInstance" |
| SQLCMDWORKSTATION | -H | R | "ComputerName" |
| SQLCMDDBNAME | -d | R | "" |
| SQLCMDLOGINTIMEOUT | -l | R/W | "8"(秒) |
| SQLCMDSTATTIMEOUT | -t | R/W | "0" = 無限期等待 |
| SQLCMDHEADERS | -H | R/W | "0" |
| SQLCMDCOLSEP | -S | R/W | “ ” |
| SQLCMDCOLWIDTH | -w | R/W | "0" |
| SQLCMDPACKETSIZE | -A | R | "4096" |
| SQLCMDERRORLEVEL | -M | R/W | 0 |
| SQLCMDMAXVARTYPEWIDTH | -y | R/W | "256" |
| SQLCMDMAXFIXEDTYPEWIDTH | -y | R/W | "0" = 無限制 |
| SQLCMDEDITOR | ? | R/W | "edit.com" |
| SQLCMDINI | ? | R | "" |
| SQLCMDUSEAAD | -G | R/W | "" |
使用?:Connect?時設置 SQLCMDUSER、SQLCMDPASSWORD 和 SQLCMDSERVER。
R 表示在程序初始化過程中只能設置一次值。
R/W 表示可以使用?setvar?命令修改值,并且后續命令將受新值的影響。
sqlcmd 命令
除 sqlcmd 中的 Transact-SQL 語句之外,還可使用以下命令:
| GO?[count] | :List |
| [:]?RESET | :Error |
| [:]?ED | :Out |
| [:]?!! | :Perftrace |
| [:]?QUIT | :Connect |
| [:]?EXIT | :On Error |
| :r | :Help |
| :ServerList | :XML?[ON?|?OFF] |
| :Setvar | :Listvar |
使用?sqlcmd?命令時,請注意以下事項:
-
除 GO 以外,所有?sqlcmd?命令必須以冒號 (:) 為前綴。
重要
為了保持現有?osql?腳本的向后兼容性,有些命令會被視為不帶冒號。?這由 [:] 指示。
-
sqlcmd?命令只有出現在一行的開頭時,才能夠被識別。
-
所有?sqlcmd?命令都不區分大小寫。
-
每個命令都必須位于單獨的行中。?命令后面不能跟隨 Transact-SQL 語句或其他命令。
-
命令將被立即執行。?它們與 Transact-SQL 語句不同,不會放在執行緩沖區中。
編輯命令
[:]?ED
啟動文本編輯器。?該編輯器可以用來編輯當前的 Transact-SQL 批處理或上次執行的批處理。?若要編輯上次執行的批處理,必須在上一批處理執行完之后立即鍵入?ED?命令。文本編輯器由 SQLCMDEDITOR 環境變量定義。?默認編輯器為“Edit”。?若要更改編輯器,請設置 SQLCMDEDITOR 環境變量。?例如,要將編輯器設置為 Microsoft 記事本,請在命令提示符處鍵入:
SET SQLCMDEDITOR=notepad
[:]?RESET
清除語句緩存。:List
輸出語句緩存的內容。變量
: Setvar?<?var> [?"值"?]
定義?sqlcmd?腳本變量。?腳本變量具有如下格式:?$(VARNAME)。變量名稱不區分大小寫。
可以通過下列方式設置腳本變量:
-
隱式使用命令行選項。?例如,?-l?選項可設置 SQLCMDLOGINTIMEOUT?sqlcmd?變量。
-
顯式使用?:Setvar?命令。
-
在運行?sqlcmd之前定義一個環境變量。
備注
-X?選項可阻止將環境變量傳遞給?sqlcmd。
如果使用?:Setvar?定義的變量和某個環境變量同名,則使用?:Setvar?定義的變量優先。
變量名中不能包含空格字符。
變量名不能與變量表達式(如 $(var))具有相同的形式。
如果腳本變量的字符串值中含有空格,請用引號將該值引起來。?如果未指定腳本變量的值,則將刪除該腳本變量。
:Listvar
顯示當前設置的腳本變量列表。
備注
只顯示由?sqlcmd設置的腳本變量和使用?:Setvar?命令設置的腳本變量。
輸出命令
:Error?
<?filename?>|?STDERR|STDOUT
將所有錯誤輸出重定向到?file name指定的文件、?stderr?或?stdout。?Error?命令可以在一個腳本中多次出現。?默認情況下,錯誤輸出將發送到?stderr。
file name
創建并打開一個要接收輸出的文件。?若該文件已經存在,則將其截斷為零字節。?若該文件不可用(由于權限或其他原因),將不會切換輸出,也不會將輸出發送到上次指定的目標或默認目標。
STDERR
將錯誤輸出切換到?stderr?流。?如果已經重定向,流的重定向目標將會收到錯誤輸出。
STDOUT
將錯誤輸出切換到?stdout?流。?如果已經重定向,流的重定向目標將會收到錯誤輸出。
:Out <?filename?>|?STDERR|?STDOUT
創建所有查詢結果并將它們重定向到?file name指定的文件、?stderr?或?stdout。?默認情況下,輸出將發送到?stdout。?若該文件已經存在,則將其截斷為零字節。?Out?命令可以在一個腳本中多次出現。
:Perftrace <?filename?>|?STDERR|?STDOUT
創建所有性能跟蹤信息并將它們重定向到?file name指定的文件、?stderr?或?stdout。?默認情況下,性能跟蹤輸出將發送到?stdout。?若該文件已經存在,則將其截斷為零字節。?Perftrace?命令可以在一個腳本中多次出現。
執行控制命令
:On Error[?exit?|?ignore]
設置在腳本或批處理執行過程中發生錯誤時要執行的操作。
使用?exit?選項時,?sqlcmd?退出,并顯示相應的錯誤值。
使用?ignore?選項時,?sqlcmd?會忽略錯誤,并繼續執行批處理或腳本。?默認情況下,會輸出錯誤消息。
[:]?QUIT
導致?sqlcmd?退出。
[:]?EXIT[?(statement)?]
允許將 SELECT 語句的結果用作?sqlcmd的返回值。?如果為數值,最后一個結果行的第一列將轉換為 4 字節的整數(長整型)。?MS-DOS 將低字節傳遞給父進程或操作系統錯誤級別。?Windows 200x 傳遞整個 4 字節整數。?語法為:
:EXIT(query)
例如:
:EXIT(SELECT @@ROWCOUNT)
您還可以在批處理文件中包含?EXIT?參數。?例如,在命令提示符處鍵入:
sqlcmd -Q "EXIT(SELECT COUNT(*) FROM '%1')"
使用?sqlcmd?實用工具將圓括號?()?中的所有內容發送給服務器。?如果系統存儲過程選擇了一個集合并返回一個值,則僅返回選擇的內容。?如果圓括號中沒有任何內容,則 EXIT?()?語句會執行批處理中此語句前的所有內容,然后退出,且不返回任何值。
當指定了不正確的查詢時,?sqlcmd?將退出,且不返回任何值。
下面是 EXIT 格式的列表:
-
:EXIT
不執行批處理就立即退出,無返回值。
-
:EXIT( )
執行批處理后退出,不返回值。
-
:EXIT(query)
執行包括查詢的批處理,返回查詢的結果后退出。
如果在?sqlcmd?腳本中使用 RAISERROR,并且出現狀態 127,則?sqlcmd?將退出,并將消息 ID 返回給客戶端。?例如:
RAISERROR(50001, 10, 127)
該錯誤會導致?sqlcmd?腳本終止并將消息 ID 50001 返回給客戶端。
SQL Server 保留了介于 -1 到 -99 之間的返回值;sqlcmd 定義了以下附加返回值:
| -100 | 選擇返回值前遇到錯誤。 |
| -101 | 選擇返回值時找不到行。 |
| -102 | 選擇返回值時發生轉換錯誤。 |
GO?[count]
GO 在批處理結束和任何緩存 Transact-SQL 語句執行時發出信號。?不同批次多次執行批處理。?不能在單個批處理中多次聲明變量。
其他命令
:r <?filename?>
將來自 <filename> 指定的文件中的其他 Transact-SQL 語句和 sqlcmd 命令分析到語句緩存中*。
如果文件包含的 Transact-SQL 語句后面沒有跟隨?GO,則必須在?:r?的后一行中輸入?GO。
備注
系統會相對于?sqlcmd?在其中運行的啟動目錄讀取?<?filename?>。
當遇到批處理終止符之后,將讀取并執行該文件。?可以發出多個?:r?命令。?該文件可以包含任何?sqlcmd?命令,?包括批處理終止符?GO。
備注
每遇到一個?:r?命令,交互模式下顯示的行計數都會加一。?:r?命令會出現在 list 命令的輸出中。
:Serverlist
列出在本地配置的服務器和在網絡上廣播的服務器的名稱。
:Connect?server_name[\instance_name] [-l?timeout] [-U?user_name?[-P?password]]
連接到 SQL Server 的一個實例。?同時關閉當前的連接。
超時選項:
| 0 | 永遠等待 |
| n>0 | 等待 n 秒鐘 |
SQLCMDSERVER 腳本變量將反映當前的活動連接。
如果未指定?timeout?,則其默認值將為 SQLCMDLOGINTIMEOUT 變量的值。
僅當指定了?user_name?(作為選項或環境變量)時,才會提示用戶輸入密碼。?如果已設置 SQLCMDUSER 或 SQLCMDPASSWORD 環境變量,則不會出現此提示。?如果既未提供選項,又未提供環境變量,便會使用 Windows 身份驗證模式進行登錄。?例如,若要使用集成安全性連接到 SQL Server 的一個實例?instance1(如?myserver),則會使用以下內容:
:connect myserver\instance1
若要使用腳本變量連接到?myserver?的默認實例,您會使用以下內容:
:setvar myusername test
:setvar myservername myserver
:connect $(myservername) $(myusername)
[:]?!!<?command>
執行操作系統命令。?若要執行操作系統命令,請用兩個感嘆號 (!!) 開始一行,后面輸入操作系統命令。?例如:
:!! Dir
備注
該命令在運行?sqlcmd?的計算機上執行。
:XML?[ON?|?OFF]
有關詳細信息,請參閱本主題中的?XML 輸出格式?和?JSON 輸出格式
:Help
列出?sqlcmd?命令以及每個命令的簡短說明。
sqlcmd 文件名
可以使用sqlcmd?選項或?sqlcmd?命令指定?sqlcmd?輸入文件。?可以使用?-o?選項或?:Error、?:Out?和?:Perftrace?命令指定輸出文件。?以下是使用這些文件的一些原則:
-
:Error、:Out 和 :Perftrace 應使用不同的 <filename>*。?如果使用了相同的 <filename>,這些命令的輸入可能會混雜在一起*。
-
如果從本地計算機的?sqlcmd?調用遠程服務器上的輸入文件,并且該文件包含驅動器文件路徑(如 :out c:\OutputFile.txt),?將在本地計算機而不是遠程服務器上創建輸出文件。
-
有效文件路徑包括:?C:\<filename>、?\\<Server>\<Share$>\<filename>?和?"C:\Some Folder\<file name>"。?如果路徑中包含空格,請使用引號。
-
每個新的?sqlcmd?會話都將覆蓋現有的同名文件。
信息性消息
sqlcmd 打印輸出服務器發送的所有信息性消息。?在以下示例中,執行 Transact-SQL 語句后會輸出信息性消息。
在命令提示符下鍵入以下內容:
sqlcmd
在 sqlcmd 提示符下鍵入:
USE AdventureWorks2012;
GO
按下 Enter 時,會輸出以下信息性消息:“已將數據庫上下文改為 'AdventureWorks2012'。”
Transact-SQL 查詢的輸出格式
sqlcmd?首先輸出列標題,其中包含在選擇列表中指定的列名。?列名使用 SQLCMDCOLSEP 字符分隔。?默認情況下,將使用空格。?如果列名短于列寬,則使用空格填充輸出,直到下一列。
此行將跟隨一行分隔行,分隔行是一系列的破折號字符。?以下輸出顯示了一個示例。
啟動?sqlcmd。?在?sqlcmd?命令提示符下鍵入以下命令:
USE AdventureWorks2012;
SELECT TOP (2) BusinessEntityID, FirstName, LastName
FROM Person.Person;
GO
按下 Enter 時,會返回以下結果集。
BusinessEntityID FirstName LastName
---------------- ------------ ----------
285 Syed Abbas
293 Catherine Abel
(2 row(s) affected)
雖然?BusinessEntityID?列只有 4 個字符寬,但已將其擴展以適應更長的列名。?默認情況下,輸出會在 80 個字符處終止。?可通過使用?-w?選項或設置 SQLCMDCOLWIDTH 腳本變量來進行更改。
XML 輸出格式
從 FOR XML 子句得到的 XML 輸出是在連續流中的未格式化的輸出。
若要得到 XML 輸出,請使用以下命令:?:XML ON。
備注
sqlcmd?將采用常見的格式返回錯誤消息。?請注意,XML 文本流中的錯誤消息還將采用 XML 格式輸出。?如果使用?:XML ON,則?sqlcmd?不顯示信息性消息。
若要關閉 XML 模式,請使用以下命令:?:XML OFF。
發出 XML OFF 命令之前不應顯示 GO 命令,因為 XML OFF 命令會將?sqlcmd?切換回面向行的輸出。
XML(流形式)數據和行集數據不能混合。?如果在執行輸出 XML 流的 Transact-SQL 語句之前未發出 XML ON 命令,則輸出將為亂碼。?如果已發出 XML ON 指令,則無法執行輸出常規行集的 Transact-SQL 語句。
備注
:XML?命令不支持 SET STATISTICS XML 語句。
JSON 輸出格式
若要得到 JSON 輸出,請使用以下命令:?:XML ON。?否則,輸出包括的列名和 JSON 文本。?此輸出不是有效的 JSON。
若要關閉 XML 模式,請使用以下命令:?:XML OFF。
有關詳細信息,請參閱本主題中的?XML 輸出格式?。
使用 Azure Active Directory 身份驗證
使用 Azure Active Directory 身份驗證的示例:
復制
sqlcmd 最佳方法
使用以下方法來幫助實現最高的安全性和效率。
-
使用集成安全性。
-
在自動化環境中使用?-X?。
-
使用適當的 NTFS 文件系統權限保護輸入文件和輸出文件。
-
若要提高性能,請在一個?sqlcmd?會話中執行盡可能多的操作,而不是在一系列會話中來執行這些操作。
-
將批處理或查詢執行的超時值設置為大于您所預期的值。
轉載于:https://www.cnblogs.com/jinanxiaolaohu/p/10728767.html
總結
以上是生活随笔為你收集整理的[转帖]Sqlcmd使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20175333曹雅坤 实验二 Java
- 下一篇: 了解vue里的Runtime Only和