2021年4月15日 星期四

[研究] SQL Server 的 T-SQL 語法 DISTINCT 和 Count 不區分大小寫 (英文大小寫視為相同)

[研究] SQL Server 的 T-SQL 語法 DISTINCT , Count , WHERE 不區分大小寫 (英文大小寫視為相同)

2021-04-15


如果在安裝SQL Server未特別指定定序的話,預設會是 Chinese_Taiwan_Stroke_CI_AS

其中的 _CI:不分大小寫;_AS:區分腔調字

相反的,如果要區分大小寫的話就必須用

_CS:區分大小寫;_AI:不區分腔調字

可用  SELECT CONVERT (varchar(256), SERVERPROPERTY('collation'));   查目前資料設定的定序。

解決方法,例如

SELECT DISTINCT CAST(FieldText AS varbinary(8000)) FROM [Table1];

SELECT DISTINCT (SELECT FieldText COLLATE Chinese_Taiwan_Stroke_CS_AS) FROM [Table1];

SELECT DISTINCT FieldText COLLATE Chinese_Taiwan_Stroke_CS_AS FROM [Table1];


********************************************************************************

測試

SELECT * FROM [TestDB].[dbo].[Table1];


SELECT FieldText, Count(*) FROM Table1 GROUP BY FieldText;


SELECT FieldText COLLATE Chinese_Taiwan_Stroke_CS_AS, Count(*) FROM Table1 GROUP BY FieldText;


-- 不能這樣寫,會出錯:資料行 'Table1.FieldText' 在選取清單中無效,因為它並未包含在彙總函式或 GROUP BY 子句中。

--SELECT FieldText , Count(*) FROM Table1 GROUP BY FieldText COLLATE Chinese_Taiwan_Stroke_CS_AS;


-- 若 Count 時候要把英文大小寫視為不同,寫法如下

SELECT FieldText COLLATE Chinese_Taiwan_Stroke_CS_AS , Count(*) 

FROM Table1 GROUP BY FieldText COLLATE Chinese_Taiwan_Stroke_CS_AS;



********************************************************************************

********************************************************************************

注意,欄位名稱後方加上 COLLATE Chinese_Taiwan_Stroke_CS_AS ,欄位就沒有名稱了,要自己給個欄位名稱。

********************************************************************************

Click 圖片可看 100% 原始圖片

********************************************************************************

用 ASP.NET 網頁執行:執行逾時到期。在作業完成之前超過逾時等待的時間,或是伺服器未回應。
SQL Server Management Studio 中執行:可以執行完成。

UPDATE [dbo].[T1]
SET  [T1].[myName]=(SELECT [myName] FROM [T2] WHERE [T1].[account] COLLATE Chinese_Taiwan_Stroke_CS_AS =[T2].account COLLATE Chinese_Taiwan_Stroke_CS_AS AND [T1].[myName]<>[T2].[myName]);

--------------------------------------------------------------------------------

用 ASP.NET 網頁執行:可以執行完成。

UPDATE [dbo].[T1]
SET  [T1].[myName]=(SELECT [myName] FROM [T2] WHERE [T1].[account] =[T2].account AND [T1].[myName]<>[T2].[myName]);

不確定是否 ASP.NET 網頁中無法使用 COLLATE Chinese_Taiwan_Stroke_CS_AS

--------------------------------------------------------------------------------

下面在  ASP.NET 網頁中可以執行完成,不會逾時

SELECT TOP 10 * FROM [T1] LEFT JOIN [T2]
ON [T1].[account] COLLATE Chinese_Taiwan_Stroke_CS_AS =[T2].account COLLATE Chinese_Taiwan_Stroke_CS_AS; 

(完)

沒有留言:

張貼留言