本函數接受兩個參數:@String(待處理字串)與 @Capitalize_What(轉換模式),支援三種模式:
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 區分大小寫,且目前不支援參數預設值,期待未來版本改進。