工作中时常遇到字符串转换为拼音的需求。特别目前在各大网站平台都可以看到的基于拼音的查询功能。如果在查询中增加相应的拼音查询,就可以减少很多的因中文汉字完全输入的不便利,例如:当我要查询叫”郭德纲“人员时,直接输入"GDG"即可,这样是不是比较方便输入。
    
    中文汉字有个特点:同字不同音 。在不同的语境或中文汉字组合时,会出现不同的读法。比如:参加会议中的”参“和中药材人参中“参”是两个不同的读音,诸如这样的中文汉字有不少的。本版块的实现也存在这样的问题。可以通过项目或平台基于使用中文多音字的频率来选择同一的转换,比如说:你所在的公司是中药材有关的行业,就可以将“参”对应的字母匹配为“S";如果你所在的公司具有起人名的业务,可以将中文汉字”查“(姓氏读查,如查良庸----起笔名为金庸)的字母匹配为”C“等等。
 
 IF OBJECT_ID(N'dbo.ufn_Pinyin', N'FN') IS NOT NULL
BEGIN
DROP FUNCTION dbo.ufn_Pinyin;
END
GO --==================================
-- 功能: 获取字符串的拼音
-- 说明: 针对中文汉字的多音字情况,可以在函数中增加多音字的字母匹配,缺点就是以后遇到该中文汉字不论其作出语境如何都会按照其多音字的字母匹配。
-- 作者: XXX
-- 创建: XXXX-XX-XX
-- 修改: XXX-XXX-XX XXX XXXXXXXX
-- 调用: SELECT dbo.ufn_Pinyin(N'中国') AS Pinyin;
--==================================
CREATE FUNCTION dbo.ufn_Pinyin
(
@chvnStr NVARCHAR() -- 字符串
) RETURNS NVARCHAR()
--$Encode$--
AS
BEGIN
-- NULL默认值处理
SET @chvnStr = ISNULL(@chvnStr, N''); -- 声明局部变量
DECLARE
@intLen AS INT,
@chvnPinyin AS NVARCHAR(),
@chnCharacter AS NCHAR();
-- 初始化局部变量
SELECT
@intLen = ,
@chvnPinyin = N'',
@chnCharacter = N''; -- 插入的字符串为空字符串则直接返回该函数
IF @chvnStr = N''
BEGIN
RETURN @chvnPinyin;
END -- 声明中文汉字的局部表变量
DECLARE @tblChineseCharacter TABLE (
ChineseCharacter NCHAR() COLLATE Chinese_PRC_CI_AS NOT NULL,
Letter NCHAR() NOT NULL
); -- 向中文汉字的局部表变量插入数据
INSERT INTO @tblChineseCharacter (ChineseCharacter, Letter)
SELECT N'吖', N'A' UNION ALL SELECT N'八', 'B' UNION ALL SELECT N'嚓', 'C' UNION ALL SELECT N'咑', N'D' UNION ALL
SELECT N'妸', N'E' UNION ALL SELECT N'发', 'F' UNION ALL SELECT N'旮', 'G' UNION ALL SELECT N'铪', N'H' UNION ALL
SELECT N'丌', N'J' UNION ALL SELECT N'咔', 'K' UNION ALL SELECT N'垃', 'L' UNION ALL SELECT N'嘸', N'M' UNION ALL
SELECT N'拏', N'N' UNION ALL SELECT N'噢', 'O' UNION ALL SELECT N'妑', 'P' UNION ALL SELECT N'七', N'Q' UNION ALL
SELECT N'呥', N'R' UNION ALL SELECT N'仨', 'S' UNION ALL SELECT N'他', 'T' UNION ALL SELECT N'屲', N'W' UNION ALL
SELECT N'夕', N'X' UNION ALL SELECT N'丫', 'Y' UNION ALL SELECT N'帀', 'Z' UNION ALL SELECT N'参', N'S' /*增加多音字的字母匹配*/; -- 获取字符串的长度
SET @intLen= LEN(@chvnStr); WHILE @intLen >= /*@intLen > 0*/
BEGIN
-- 从后往前逐次获取单个字符
SET @chnCharacter = SUBSTRING(@chvnStr, @intLen, ); -- 获取当前字符对应的字母
SELECT TOP @chvnPinyin = Letter + @chvnPinyin
FROM @tblChineseCharacter
WHERE ChineseCharacter <= @chnCharacter
ORDER BY ChineseCharacter DESC; -- 如果当前受影响的行数为0,则表示当前字符可能是中文外的其他字符,如英文字符等等
IF @@ROWCOUNT =
BEGIN
SET @chvnPinyin = SUBSTRING(@chvnStr, @intLen, ) + @chvnPinyin;
END -- 字符串长度局部变量递减
SET @intLen = @intLen - ;
END RETURN @chvnPinyin;
END
GO

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

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

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

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

SQL Server 中获取字符串拼音的标量函数实现的更多相关文章

  1. SQL Server中截取字符串常用函数

    SQL Server 中截取字符串常用的函数: .LEFT ( character_expression , integer_expression ) 函数说明:LEFT ( '源字符串' , '要截 ...

  2. 在SQL SERVER中获取表中的第二条数据

    在SQL SERVER中获取表中的第二条数据, 思路:先根据时间逆排序取出前2条数据作为一个临时表,再按顺时排序在临时表中取出第一条数据 sql语句如下: select top 1 * from(se ...

  3. SQL Server 中截取字符串常用的函数

    SQL Server 中截取字符串常用的函数: 1.LEFT ( character_expression , integer_expression ) 函数说明:LEFT ( '源字符串' , '要 ...

  4. sql server中截取字符串的常用函数

    我们如果要在sql server中,使用截取字符串的方法要怎样使用呢? sql server提供了3个常用截取字符串方法,LEFT().RIGHT().SUBSTRING() /****** Sql ...

  5. MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建

    前言 在操作数据库的时候经常会用到判断数据表.视图.函数/方法.存储过程是否存在,若存在,则需要删除后再重新创建.以下是MS SQL Server中的示例代码. 数据表(Table) 创建数据表的时候 ...

  6. SQL SERVER中获取表间主外键关系

    sql server 2008中的主外键关系获取方式: 转自:http://www.cnblogs.com/ke10/archive/2012/06/11/2544655.html SELECT OB ...

  7. SQL Server中获取指定时间段内的所有日期

    DECLARE @days INT, @date_start DATETIME = '2016-11-01', @date_end DATETIME = '2016-11-10' SET @days ...

  8. SQL server中获取语句执行时间

    在写代码的时候,有时候实现一个功能会有好多个方法,有时候会做一下方法的耗时对比,综合下时间复杂度与空间复杂度,写出最好的代码: 同样,在写一些SQL查询,SQL代码的时候,也希望能写出一个高效一点的查 ...

  9. SQL Server中判断字符串出现的位置及字符串截取

    首先建一张测试表: )); insert into teststring values ('张三,李四,王五,马六,萧十一,皇宫'); 1.判断字符串中某字符(字符串)出现的次数,第一次出现的位置最后 ...

随机推荐

  1. 深入浅出Java多线程

    Java给多线程编程提供了内置的支持.一个多线程程序包含两个或多个能并发运行的部分.程序的每一部分都称作一个线程,并且每个线程定义了一个独立的执行路径. 多线程是多任务的一种特别的形式,但多线程使用了 ...

  2. 「Ionic」創建新項目

    1.創建新項目 创建一个名为myApp的还有tabs的项目(ionic start <project-name> <optional-template>) 可选模板为sidem ...

  3. CentOS 6.5/6.6 安装(install)mysql 5.7 最完整版教程

    Step1: 检测系统是否自带安装mysql # yum list installed | grep mysql Step2: 删除系统自带的mysql及其依赖命令: # yum -y remove ...

  4. Lucene.net站内搜索—2、Lucene.Net简介和分词

    目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...

  5. java多线程-线程通信

    线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 通过共享对象通信 忙等待 wait(),notify()和 notifyAll() 丢失的信号 假唤醒 多线 ...

  6. Windows安装apache2.4

    The primary Windows platform for running Apache 2.4 is Windows 2000 or later. Always obtain and inst ...

  7. HTML5移动开发学习笔记

    最近做webapp项目过程中,发现坑还是挺多的,以下是网络收集一些开发中的常见问题及知识汇总,以便查阅,慢慢更新:). meta 基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 < ...

  8. SharePoint解决The security validation for this page is invalid.

    我是在一个service后台用object model去check in一个spfile的时候报的这个错.这是SharePoint的一种保护机制,在处理不能确定是安全的请求时,sharepoint就会 ...

  9. 首届Autodesk编程马拉松(Hackathon)开始报名啦 -- 6.14~15 上海

    欢迎报名参加Autodesk 首届编程马拉松 ( Hackathon ) 活动   首届Autodesk编程马拉松(Hackathon)活动即将在Autodesk公司中国研究院(上海)举办.本次编程马 ...

  10. NSString学习

    基本概念 NSString是以UTF-16 code uint的序列.所有的长度.字符.范围都是以16比特platform-endian(大端序小段序基于平台)的形式表示的. 所以,一个英文字母的长度 ...