SQL Server 2000 預設排序規則通常為不區分大小寫(CI),若需在特定查詢中進行區分大小寫(CS)比較,可透過 COLLATE 子句或自訂函數實現。本文提供一個純 T-SQL 純量函數範例,逐字元比對 ASCII 碼以達成嚴格區分大小寫。
CREATE FUNCTION dbo.StrComp
(
@Str1 VARCHAR(50),
@Str2 VARCHAR(50)
)
RETURNS INT
AS
BEGIN
DECLARE @i INT = 0;
DECLARE @result INT = 1; -- 1=相同, 0=不同
DECLARE @len1 INT = LEN(LTRIM(RTRIM(@Str1)));
DECLARE @len2 INT = LEN(LTRIM(RTRIM(@Str2)));
DECLARE @maxLen INT = CASE WHEN @len1 > @len2 THEN @len1 ELSE @len2 END;
WHILE @i < @maxLen
BEGIN
IF ASCII(SUBSTRING(@Str1, @i + 1, 1)) = ASCII(SUBSTRING(@Str2, @i + 1, 1))
SET @i = @i + 1;
ELSE
BEGIN
SET @result = 0;
BREAK;
END
END
RETURN @result;
END
-- 查詢 Field1 完全等於 'aAbB'(區分大小寫)的資料列
SELECT *
FROM Table1
WHERE dbo.StrComp(Field1, 'aAbB') = 1;
| 方案 | 優點 | 缺點 | 適用版本 |
|---|---|---|---|
| UDF 逐字元比對 | 邏輯直觀、無需變更資料庫排序 | 逐列執行、無法使用索引、大量資料效能差 | SQL 2000+ |
COLLATE Latin1_General_CS_AS | 可使用索引、集合運作、效能佳 | 需指定排序規則、跨資料庫/伺服器需一致 | SQL 2000+ |
BINARY_CHECKSUM / CHECKSUM | 極快 | 有碰撞機率、非嚴格比對 | SQL 2000+ |
| 計算欄位 + 索引 | 查詢極快 | 增加儲存/維護成本 | SQL 2005+ |
WHERE Field1 = 'aAbB' COLLATE Latin1_General_CS_AS 可直接利用索引。Chinese_PRC_CS_AS 等 CS 排序規則。