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

SQL Server 2000 使用者自訂函數深度解析(下):大小寫轉換函數實作

     編輯:關於SqlServer

大小寫轉換函數 Capitalize

本函數接受兩個參數:@String(待處理字串)與 @Capitalize_What(轉換模式),支援三種模式:

  • string:將字串第一個非空白字元轉大寫,其餘轉小寫。
  • sentence:將每個句子(以 . ! ? 為分隔)的第一個非空白字元轉大寫,其餘轉小寫。
  • Word:將字串中每個單字的首字元轉大寫,其餘轉小寫(非英數字元視為分隔)。

完整函數程式碼

CREATE FUNCTION dbo.Capitalize (
    @String VARCHAR(8000),
    @Capitalize_What VARCHAR(8) = 'string'
)
RETURNS VARCHAR(8000)
AS
BEGIN
    DECLARE @Position SMALLINT,
            @Char CHAR(1),
            @First_Char CHAR(1),
            @Word_Start SMALLINT;

    SET @Capitalize_What = LOWER(@Capitalize_What);
    SET @Word_Start = 0;

    IF @Capitalize_What IN ('Word', 'sentence')
    BEGIN
        SET @Position = DATALENGTH(@String);
        WHILE @Position >= 0
        BEGIN
            SET @Char = CASE @Position
                WHEN 0 THEN '.'
                ELSE UPPER(SUBSTRING(@String, @Position, 1))
            END;

            IF @Char BETWEEN 'A' AND 'Z' OR @Char BETWEEN '0' AND '9'
            BEGIN
                SET @Word_Start = @Position;
                SET @First_Char = UPPER(@Char);
            END
            ELSE
            BEGIN
                IF @Capitalize_What = 'Word' OR @Char IN ('.', '!', '?')
                BEGIN
                    IF @Word_Start > 0 AND @First_Char BETWEEN 'A' AND 'Z'
                        SET @String = STUFF(@String, @Word_Start, 1, @First_Char);
                    SET @Word_Start = 0;
                END
            END
            SET @Position = @Position - 1;
        END
    END
    ELSE -- Capitalize the first character
    BEGIN
        SET @Position = 0;
        WHILE @Position < DATALENGTH(@String)
        BEGIN
            SET @Position = @Position + 1;
            SET @Char = UPPER(SUBSTRING(@String, @Position, 1));
            IF @Char BETWEEN 'A' AND 'Z' OR @Char BETWEEN '0' AND '9'
            BEGIN
                SET @String = STUFF(@String, @Position, 1, @Char);
                SET @Position = 9999; -- 跳出迴圈
            END
        END
    END
    RETURN @String;
END;
GO

使用範例

SELECT dbo.Capitalize('hello world', 'string');   -- Hello world
SELECT dbo.Capitalize('hello. world!', 'sentence'); -- Hello. World!
SELECT dbo.Capitalize('hello world', 'Word');      -- Hello World

小結與展望

SQL Server 2000 的 UDF 極大擴展了資料庫程式設計能力,可建立通用函數庫存放於 master 資料庫供所有資料庫呼叫。但 UDF 區分大小寫,且目前不支援參數預設值,期待未來版本改進。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved