你的位置:首页 > 数据库

[数据库]SQL Server 中获取字符串拼音的标量函数实现

    工作中时常遇到字符串转换为拼音的需求。特别目前在各大网站平台都可以看到的基于拼音的查询功能。如果在查询中增加相应的拼音查询,就可以减少很多的因中文汉字完全输入的不便利,例如:当我要查询叫”郭德纲“人员时,直接输入"GDG"即可,这样是不是比较方便输入。
    
    中文汉字有个特点:同字不同音 。在不同的语境或中文汉字组合时,会出现不同的读法。比如:参加会议中的”参“和中药材人参中“参”是两个不同的读音,诸如这样的中文汉字有不少的。本版块的实现也存在这样的问题。可以通过项目或平台基于使用中文多音字的频率来选择同一的转换,比如说:你所在的公司是中药材有关的行业,就可以将“参”对应的字母匹配为“S";如果你所在的公司具有起人名的业务,可以将中文汉字”查“(姓氏读查,如查良庸----起笔名为金庸)的字母匹配为”C“等等。
 
 1 IF OBJECT_ID(N'dbo.ufn_Pinyin', N'FN') IS NOT NULL 2 BEGIN 3   DROP FUNCTION dbo.ufn_Pinyin; 4 END 5 GO 6  7 --================================== 8 -- 功能: 获取字符串的拼音 9 -- 说明: 针对中文汉字的多音字情况,可以在函数中增加多音字的字母匹配,缺点就是以后遇到该中文汉字不论其作出语境如何都会按照其多音字的字母匹配。10 -- 作者: XXX11 -- 创建: XXXX-XX-XX12 -- 修改: XXX-XXX-XX XXX XXXXXXXX13 -- 调用: SELECT dbo.ufn_Pinyin(N'中国') AS Pinyin; 14 --==================================15 CREATE FUNCTION dbo.ufn_Pinyin16 (17   @chvnStr NVARCHAR(4000)        -- 字符串18 ) RETURNS NVARCHAR(4000)19   --$Encode$--20 AS21 BEGIN22   -- NULL默认值处理23   SET @chvnStr = ISNULL(@chvnStr, N'');24 25   -- 声明局部变量26   DECLARE 27     @intLen AS INT, 28     @chvnPinyin AS NVARCHAR(4000),29     @chnCharacter AS NCHAR(1);30   -- 初始化局部变量31   SELECT32     @intLen = 0,33     @chvnPinyin = N'',34     @chnCharacter = N'';35 36   -- 插入的字符串为空字符串则直接返回该函数37   IF @chvnStr = N''38   BEGIN39     RETURN @chvnPinyin;40   END41 42   -- 声明中文汉字的局部表变量43   DECLARE @tblChineseCharacter TABLE (44     ChineseCharacter NCHAR(1) COLLATE Chinese_PRC_CI_AS NOT NULL,45     Letter NCHAR(1) NOT NULL46   );47 48   -- 向中文汉字的局部表变量插入数据49   INSERT INTO @tblChineseCharacter (ChineseCharacter, Letter)50   SELECT N'吖', N'A' UNION ALL SELECT N'八', 'B' UNION ALL SELECT N'嚓', 'C' UNION ALL SELECT N'咑', N'D' UNION ALL51   SELECT N'妸', N'E' UNION ALL SELECT N'发', 'F' UNION ALL SELECT N'旮', 'G' UNION ALL SELECT N'铪', N'H' UNION ALL52   SELECT N'丌', N'J' UNION ALL SELECT N'咔', 'K' UNION ALL SELECT N'垃', 'L' UNION ALL SELECT N'嘸', N'M' UNION ALL53   SELECT N'拏', N'N' UNION ALL SELECT N'噢', 'O' UNION ALL SELECT N'妑', 'P' UNION ALL SELECT N'七', N'Q' UNION ALL54   SELECT N'呥', N'R' UNION ALL SELECT N'仨', 'S' UNION ALL SELECT N'他', 'T' UNION ALL SELECT N'屲', N'W' UNION ALL55   SELECT N'夕', N'X' UNION ALL SELECT N'丫', 'Y' UNION ALL SELECT N'帀', 'Z' UNION ALL SELECT N'参', N'S' /*增加多音字的字母匹配*/;56 57   -- 获取字符串的长度58   SET @intLen= LEN(@chvnStr);59 60   WHILE @intLen >= 1 [email protected] > 0*/61   BEGIN62     -- 从后往前逐次获取单个字符63     SET @chnCharacter = SUBSTRING(@chvnStr, @intLen, 1);64 65     -- 获取当前字符对应的字母66     SELECT TOP 1 @chvnPinyin = Letter + @chvnPinyin67     FROM @tblChineseCharacter68     WHERE ChineseCharacter <= @chnCharacter 69     ORDER BY ChineseCharacter DESC;70 71     -- 如果当前受影响的行数为0,则表示当前字符可能是中文外的其他字符,如英文字符等等72     IF @@ROWCOUNT = 073     BEGIN74       SET @chvnPinyin = SUBSTRING(@chvnStr, @intLen, 1) + @chvnPinyin;      75     END76 77     -- 字符串长度局部变量递减78     SET @intLen = @intLen - 1;79   END80 81   RETURN @chvnPinyin;82 END83 GO

演示该函数的效果,如下的T-SQL:


1 SELECT dbo.ufn_Pinyin(N'中国') AS ColName,dbo.ufn_Pinyin(N'中国ilove你') AS Col2Name, dbo.ufn_Pinyin(N'中国我爱你') AS Col3Name;2 GO

执行的后的查询结果如下:



 
博友有解决中文多音字的拼音字母匹配的好方案,也请不吝赐教,万分感谢。
 
注意:该以上实现如果存在侵权,也请原作者提出来,谢谢。