首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2000 實現字串大小寫敏感比較的使用者定義函數

     編輯:關於SqlServer

背景

SQL Server 2000 預設排序規則通常為不區分大小寫(CI),若需在特定查詢中進行區分大小寫(CS)比較,可透過 COLLATE 子句或自訂函數實現。本文提供一個純 T-SQL 純量函數範例,逐字元比對 ASCII 碼以達成嚴格區分大小寫。

函數定義:StrComp

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+

最佳實務建議

  1. 優先使用 COLLATE: WHERE Field1 = 'aAbB' COLLATE Latin1_General_CS_AS 可直接利用索引。
  2. 資料庫/欄位層級設定 CS 排序: 若業務普遍需區分大小寫,建立資料庫或欄位時直接指定 Chinese_PRC_CS_AS 等 CS 排序規則。
  3. UDF 僅作為補救: 既有 CI 資料庫且無法變更排序、且資料量小(<10萬列)的臨時查詢可用 UDF。
  4. 避免在 WHERE 子句對大量資料表呼叫 UDF: 會導致全表掃描,嚴重拖慢效能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved