close

最近在處理DB方面的CI/CD,讓資料庫方面的異動能夠透過版控留存紀錄,在透過CI/CD去部屬到指定的環境當中。

這邊先不討論CI/CD方面怎麼處理,而是分享一下SQL Server如何透過讀取.sql檔然後在DB中執行的部分。

 

我們保存好的.sql檔是放在os的指定資料夾,透過sqlcmd的方式讀取檔案然後執行

格式

sqlcmd -s [伺服器] -u [User名稱] -p [密碼] -d [資料庫] -i [檔案名稱(包含路徑)]

範例

DECLARE @SQL NVARCHAR(MAX)

SET @SQL = 'sqlcmd -S localhost -d testDB -i D:\DBScript\SQLScript.sql'

EXEC xp_cmdshell @SQL

透過以上語法可以將指定的檔案部屬到資料庫當中

但是 !!

生為華人就難免在sql script中出現一些漢字(繁體、簡體),這時就容易發生檔案部屬失敗的狀況

而且很容易發生的是透過SSMS把準備好的sql script儲存到檔案然後讀檔執行的情況。(本端:繁體、Server:簡體)

主要是因為

UTF-8 是目前使用最廣泛的Unicode編碼格式,但是SQL Server使用的是UTF-16作爲Unicode字符的編碼格式,即NCHAR/NTEXT/NVARHCAR存儲的都是雙字節編碼的Unicode字符,以N爲前綴(比如N'Hello')的字符串即爲雙字節Unicode字符。對於UTF-8字符串,如果它只包含ANSI字符,則可以按照ANSI串處理;否則的話必須將UTF-8串轉換成UTF-16再交給SQL Server 處理。

這.....真不知道該說MS是想要搞死自己嗎.....資料庫你的、OS也是你的....你還想怎樣(翻桌)

雖然也可以每次存檔時都檢查編碼是否正確,但很多人一起維護的情況下要確保編碼都有乖乖維護是有點困難

花了一點時間研究,試了很多方法找到了一個最簡單也最好處理的方式!!!

把原本的格式調整為

格式

sqlcmd -s [伺服器] -u [User名稱] -p [密碼] -d [資料庫] -f 65001 -i [檔案名稱(包含路徑)]

P.S. 65001: UTF-8 

範例

DECLARE @SQL NVARCHAR(MAX)

SET @SQL = 'sqlcmd -S localhost -d testDB -f 65001 -i D:\DBScript\SQLScript.sql'

EXEC xp_cmdshell @SQL

這樣就可以將有出現繁體或簡體的檔案成功讀取並執行成功了!!(灑花)

 

參考:  https://docs.microsoft.com/zh-tw/sql/tools/sqlcmd-utility?view=sql-server-ver15

 

 

 

 

arrow
arrow
    文章標籤
    SQL Server T-SQL
    全站熱搜

    Louis 發表在 痞客邦 留言(0) 人氣()