[研究] 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;
沒有留言:
張貼留言