[TSQL]無法解析 equal to 作業中 Latin1_General_CI_AI 與 Chinese_Taiwan_Stroke_CI_AS 之間的定序衝突

當兩種不同的資料表INNER JOIN出現錯誤訊息是 無法解析 equal to 作業中 "Latin1_General_CI_AI" 與 "Chinese_Taiwan_Stroke_CI_AS" 之間的定序衝突。

這是今天發生的小問題,情境是我習慣用自己的小工具做一下 txtBox 或 參數的產生,
所以常使用到這段TSQL 來查詢指定 Table 下,有哪一些欄位跟欄位的資訊

 


	Select * From Information_Schema.Columns Where Table_Name = 'Company'

 

而這段指令查詢出來的資料如下圖:
image

大部分的資訊都能透過這段指令取得,而在SQL建立的時候,能夠將描述資訊也建立在欄位裡面,
image

但本來這段是查不出「描述欄位」,就突然想到之前 孤影 之前有寫到一篇 取得MS SQL中資料欄位的描述內容
就趕緊東翻西翻,好在有把他收藏起來,一下就找到這篇,而要查出描述欄位則是使用這段指令

 


select * from fn_listextendedproperty(NULL, 'user', 'dbo', 'table', N'Company', 'column',NULL)

 

image

查出來的結果就如截圖顯示,我就想說兩個都是 Table 形式 (fn 這一各是傳回Table),
那我就把這兩段指令透過共有的欄位 ColumnName 來 INNER JOIN ,這樣我就能一次的查詢,
就獲得整個欄位的全部資料,所以我就下了這段


	Select ISC.* ,F.value
 From Information_Schema.Columns AS ISC
INNER JOIN fn_listextendedproperty(NULL, 'user', 'dbo', 'table', N'Company', 'column',NULL)
AS F
ON ISC.COLUMN_NAME = F.objname 
 Where ISC.Table_Name = 'Company'

結果出現的畫面不是我想像的成功畫面,而是這段的錯誤訊息

無法解析 equal to 作業中 "Latin1_General_CI_AI" 與 "Chinese_Taiwan_Stroke_CI_AS" 之間的定序衝突。

這讓我想到前段時間 .NET Factory 跟我討論,與其他國家不同系統,部分SQL指令整合的時候,當如果遇到定序問題,
該怎麼處理?兩方如果都無法改定序時或不需要改定序的整合方法,
馬上查SQL線上叢書如何透過修改指令的方式來動態修改目前比對的欄位(INNER JOIN),
使用 COLLATE 子句來將兩邊的定序調整成指定的定序,指令如下:


	Select ISC.*   ,F.value
 From Information_Schema.Columns AS ISC
INNER JOIN fn_listextendedproperty(NULL, 'user', 'dbo', 'table', N'Company', 'column',NULL)
AS F
ON ISC.COLUMN_NAME = F.objname COLLATE Chinese_Taiwan_Stroke_CI_AS
 Where ISC.Table_Name = 'Company'

加上 COLLATE 子句就能看到成功顯示的畫面,就能透過這樣的方式,取得欄位資訊與摘要欄位。

參考資料:

設定和變更伺服器定序
設定和變更資料庫定序
設定與變更資料行定序
識別碼定序
可以使用 COLLATE 子句來覆寫常值字串的預設定序。如果不指定定序,就為常值指派資料庫的預設定序。您可以使用 DATABASEPROPERTYEX 來尋找資料庫的目前定序。