最近在處理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
留言列表