博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

相关算法如下:
有兴趣可以测试一下,希望能给你带来帮助
 using System;
 
using System.Text;
 
using System.IO;
 
namespace ts{
 
class test{
 
private static string[] startChars = {"""""","","","","","","","","","","","","","",
              
"","""","","","","","","",""}
;
   
private static string[] endChars = {"""""","","","","","","","","","","","","","",
               
"","""","","","","","","",""}
;
 
   
/// <summary>
   
/// 根据字符和对应的中文字符,转成SQL查询条件
   
/// </summary>
   
/// <param name="cChar">要转化的字符,[A-Z]</param>
   
/// <param name="strFieldName">条件左值</param>
   
/// <returns>SQL条件</returns>
   
/// <remarks> Sxf 2001-1-4 ***** JY 2002-1-4 </remarks>

   public static string GetCharCondition(char cChar, string strFieldName)
   
{
    
string strWord;
    
int Index = (int)(char.ToUpper(cChar)) - (int)'A';
    
if (Index >= 0 && Index < 26)
     strWord 
= startChars[Index];
    
else
     strWord 
= startChars[0];
    
//            return string.Format("(({0}>='{1}' AND {0}<'[') OR ({0} >= '{3}' AND {0} < '{{') OR {0}>='{2}')", 
    
//                strFieldName, char.ToUpper(cChar), strWord, char.ToLower(cChar));
    return string.Format("(({0} >= '{3}' AND {0} <= 'zzzzzzzz') OR {0}>='{2}')"
     strFieldName, 
char.ToUpper(cChar), strWord, char.ToLower(cChar));
   }

 
         
/// <summary>
         
/// 将指定字段值的每个字符分割,这样可以生成同音查询的SQL
         
/// </summary>
         
/// <param name="fieldName">字段名</param>
         
/// <param name="fieldValue">字段值</param>
         
/// <returns>生成的可以进行同音查询的SQL</returns>

   public static string GetCharFullCondition(string fieldName, string fieldValue)
   
{
    StringBuilder sql 
= new StringBuilder(1024);
    
int i = 1;
    
foreach (char c in fieldValue)
    
{
     
if (i > 1)
      sql.Append(
" AND ");
     
int index = (int)(char.ToUpper(c)) - (int)'A';
     
string startWord, endWord;
     
if (index >= 0 && index < 26)
     
{
      startWord 
= startChars[index];
      endWord 
= endChars[index];
     }

     
else
     
{
      startWord 
= startChars[0];
      endWord 
= endChars[0];
     }

     
string subStr = String.Format("SUBSTRING({0}, {1}, {2})", fieldName, i, 1);
     sql.AppendFormat(
"({0} BETWEEN '{1}' AND '{2}')", subStr, startWord, endWord);
     
++i;
    }

 
    
return sql.ToString();
   }

 }

 }
 
我这个是基于SqlServer2000中的自定义函数的,如下:

Create function getPY(@str nvarchar(4000))
returns nvarchar(4000)
as
begin
declare @word nchar(1),@PY nvarchar(4000)
set @PY=''
while len(@str)>0
begin
set @word=left(@str,1)
--如果非汉字字符,返回原字符
set @PY=@PY+(case when unicode(@word) between 19968 and 19968+20901
then (select top 1 PY from (
select 'A' as PY,N'驁' as word
union all select 'B',N'簿'
union all select 'C',N'錯'
union all select 'D',N'鵽'
union all select 'E',N'樲'
union all select 'F',N'鰒'
union all select 'G',N'腂'
union all select 'H',N'夻'
union all select 'J',N'攈'
union all select 'K',N'穒'
union all select 'L',N'鱳'
union all select 'M',N'旀'
union all select 'N',N'桛'
union all select 'O',N'漚'
union all select 'P',N'曝'
union all select 'Q',N'囕'
union all select 'R',N'鶸'
union all select 'S',N'蜶'
union all select 'T',N'籜'
union all select 'W',N'鶩'
union all select 'X',N'鑂'
union all select 'Y',N'韻'
union all select 'Z',N'咗'
) T
where word>=@word collate Chinese_PRC_CS_AS_KS_WS
order by PY ASC) else @word end)
set @str=right(@str,len(@str)-1)
end
return @PY
end

调用方法是:

using System;
using System.Data;
using System.Data.SqlClient;
using Microsoft.ApplicationBlocks.Data;

namespace Function
{
public class 生成助记码
{
/// <summary>
/// 根据汉字获取拼音首码
/// </summary>
/// <param name="Chinese"></param>
/// <returns></returns>
public static string GetPY(string Chinese)
{
SqlParameter [] param = new SqlParameter[1];
param[0] = new SqlParameter("@中文",Chinese);

try
{
object objPingYing = SqlHelper.ExecuteScalar(数据连接字串,CommandType.Text,"select dbo.GetPY(@中文)",param);
if (objPingYing==null)
{
return string.Empty;
}
else
{
return objPingYing.ToString();
}
}
catch
{
return string.Empty;
}
}

}