工作中时常遇到字符串转换为拼音的需求。特别目前在各大网站平台都可以看到的基于拼音的查询功能。如果在查询中增加相应的拼音查询,就可以减少很多的因中文汉字完全输入的不便利,例如:当我要查询叫”郭德纲“人员时,直接输入"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. 框架SpringMVC笔记系列 二 传值

    主题:SpringMVC(第一节中再回顾复习一次) 学习资料参考网址: 1.http://www.icoolxue.com 2.http://haohaoxuexi.iteye.com/blog/13 ...

  2. 初识React Native,踩坑之旅....

    开启Genymotion Android模拟器后 1.运行“react-native run-android”报端口冲突....解决方法: 2.运行“react-native run-android” ...

  3. linux基础知识总结

    使用linux将近一年了,一直都没有时间来总结一下,借着最近在整理知识框架的机会总结一下linux的应用知识.   1.linux有两个目录很特殊,一个是~,另一个是/.两个目录的含义不一样,/是系统 ...

  4. GJM:书籍相关整理 [原创]

    多人在线教程(中文)MultiplayerTutorial.pdf           链接: http://pan.baidu.com/s/1boDGGGZ 密码:9l2g 版权声明:本文原创发表于 ...

  5. Click Magick – 下一代点击跟踪和链接管理

    Click Magick 是新一代的广告跟踪和链接管理系统,让每一个点击都能给你带去更多的利润.它是专门设计来跟踪所有类型的点击计费广告,包括从谷歌,必应和 Facebook 的 PPC 广告,就好像 ...

  6. Repeater分页代码

    //ASP.NET中的DataList和Repeater提供了简单快速的方法來显示,其间,我们可以使用<ItemTemplate>更是使我们能随心所欲的控制数据的排放样式! //.可惜的是 ...

  7. 精通 CSS 选择器(二)

    补充了一些之前遗漏掉的选择器以及一些在 Selectors Level 4 中新定义的选择器. 属性选择器不区分大小写 [attribute="value" i],在 Select ...

  8. JavaScript异步机制

    单线程异步执行的JavaScript JavaScript是单线程异步执行的,单线程意味着代码在任务队列中会按照顺序一个接一个的执行.异步代表JavaScript代码在任务队列中的顺序并不完全等同于代 ...

  9. [javascript svg fill stroke stroke-width x y rect rx ry 属性讲解] svg fill stroke stroke-width rect 绘制具有圆角矩形属性讲解

    <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...

  10. NDK-JNI实战教程(二) JNI官方中文资料

    声明 设计概述 JNI接口函数和指针 加载和链接本地方法 解析本地方法名 本地方法的参数 引用Java对象 全局和局部引用 实现局部引用 访问Java对象 访问基本类型数组 访问域和方法 报告编程错误 ...