我从网上找了几个函数,但总是得不到正确的结果,
//代码一
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER function [dbo].[fun_getPY](@str nvarchar(4000))
returns nvarchar(4000)
as
begin
declare @word nchar(1),@PY nvarchar(4000),@i int
set @PY=''
set @i=1
while (substring(@str,@i,1)<>'' or @i<=len(@str))
begin
set @word=substring(@str,@i,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 @i=@i+1
end
return @PY
end
--测试
select dbo.fun_getPY('中华人民共和国')
结果
???????查出全是问号//代码二
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
goALTER function [dbo].[fGetPy](@Str varchar(500)='')
returns varchar(500)
as
begin
    declare @strlen int,@return varchar(500),@ii int
    declare @n int,@c char(1),@chn nchar(1)    select @strlen=len(@str),@return='',@ii=0
    set @ii=0
    while @ii<@strlen
    begin
        select @ii=@ii+1,@n=63,@chn=substring(@str,@ii,1)
        if @chn>'z'
        select @n = @n +1
                    ,@c = case chn when @chn then char(@n) else @c end
            from(
                select top 27 * from (
                    select chn = '吖'
                    union all select '八'
                    union all select '嚓'
                    union all select '咑'
                    union all select '妸'
                    union all select '发'
                    union all select '旮'
                    union all select '铪'
                    union all select '丌'        --because have no 'i'
                    union all select '丌'
                    union all select '咔'
                    union all select '垃'
                    union all select '嘸'
                    union all select '拏'
                    union all select '噢'
                    union all select '妑'
                    union all select '七'
                    union all select '呥'
                    union all select '仨'
                    union all select '他'
                    union all select '屲'        --no 'u'
                    union all select '屲'        --no 'v'
                    union all select '屲'
                    union all select '夕'
                    union all select '丫'
                    union all select '帀'
                    union all select @chn) as a
                order by chn COLLATE Chinese_PRC_CI_AS 
            ) as b
        else set @c='a'
        set @return=@return+@c
    end
    return(@return)
end
--测试
select dbo.fgetPY('中华人民共和国')
结果:aaaaaaa
全是a网上这样的代码大多都是转的,也都差不多,但为什么我的总是不能得到我要的结果,请问是哪的问题,我是在sql2005中测试的.

解决方案 »

  1.   

    --获取拼音首字母函数
    create function f_GetPy(@str nvarchar(4000))
    returns nvarchar(4000)
    as
    begin
    declare @strlen int,@re nvarchar(4000)
    declare @t table(chr nchar(1) collate Chinese_PRC_CI_AS,letter nchar(1))
    insert into @t(chr,letter)
      select '吖','A' union all select '八','B' union all
      select '嚓','C' union all select '咑','D' union all
      select '妸','E' union all select '发','F' union all
      select '旮','G' union all select '铪','H' union all
      select '丌','J' union all select '咔','K' union all
      select '垃','L' union all select '嘸','M' union all
      select '拏','N' union all select '噢','O' union all
      select '妑','P' union all select '七','Q' union all
      select '呥','R' union all select '仨','S' union all
      select '他','T' union all select '屲','W' union all
      select '夕','X' union all select '丫','Y' union all
      select '帀','Z'
      select @strlen=len(@str),@re=''
      while @strlen>0
      begin
        select top 1 @re=letter+@re,@strlen=@strlen-1
          from @t a where chr<=substring(@str,@strlen,1)
          order by chr desc
        if @@rowcount=0
          select @re=substring(@str,@strlen,1)+@re,@strlen=@strlen-1
      end
      return(@re)
    end
    go
    --调用
    select * from a order by case Name when '其他' then 1 else 0 end,dbo.f_GetPy(Name)--获取字符串拼音字头
    --Pqs 2006-11-20
    --@Char 输入的字符串
    CREATE function dbo.GetPY (@Char varchar(100))  
    returns varchar(100) as 
    begin
     --字符串长度        返回数据        遍历字符串位置        遍历的字符
     declare @i_Len int, @c_Return varchar(100), @i_pos int,@c varchar(2),@c_CN varchar(100)
     --初始化数据
     --set @str='龙岂池中物'
     set @i_Len = len(@Char)
     set @c_Return = ''
     set @i_pos = 0 
     --遍历字符串 
     while (@i_pos < @i_Len )
     begin
      set @i_pos = @i_pos + 1
      set @c_CN = substring(@Char, @i_pos, 1)
      if (@c_CN > 'z' )
      --中文处理,查询匹配
      begin
             set @c = case when @c_CN>='帀' then 'Z'      when @c_CN>='丫' and @c_CN<'帀' then 'Y'     when @c_CN>='夕' and @c_CN<'丫' then 'X'     when @c_CN>='屲' and @c_CN<'夕' then 'W'
             when @c_CN>='他' and @c_CN<'屲' then 'T'     when @c_CN>='仨' and @c_CN<'他' then 'S'     when @c_CN>='呥' and @c_CN<'仨' then 'R'     when @c_CN>='七' and @c_CN<'呥' then 'Q'
             when @c_CN>='妑' and @c_CN<'七' then 'P'     when @c_CN>='噢' and @c_CN<'妑' then 'O'     when @c_CN>='拏' and @c_CN<'噢' then 'N'     when @c_CN>='嘸' and @c_CN<'拏' then 'M'
             when @c_CN>='垃' and @c_CN<'嘸' then 'L'     when @c_CN>='咔' and @c_CN<'垃' then 'K'     when @c_CN>='丌' and @c_CN<'咔' then 'J'     when @c_CN>='铪' and @c_CN<'丌' then 'H'
             when @c_CN>='旮' and @c_CN<'铪' then 'G'     when @c_CN>='发' and @c_CN<'旮' then 'F'     when @c_CN>='妸' and @c_CN<'发' then 'E'     when @c_CN>='咑' and @c_CN<'妸' then 'D'
             when @c_CN>='嚓' and @c_CN<'咑' then 'C'     when @c_CN>='八' and @c_CN<'嚓' then 'B'     when @c_CN>='吖' and @c_CN<'八' then 'A'     Else '' End
    --       select  top 1 @c = Code  from Code_PY   where name <= @c_CN
      end
      else
      begin
        --过滤字符(除了字符、数字和'.'外的所有字符)
        if (@c_CN>='a' or (@c_CN>='0' and @c_CN<='9') or @c_CN='.')
            set @c=@c_CN
        else
            set @c=''
      end
      
      set @c_Return=@c_Return+isnull(@c ,'')
     end
     return  upper(@c_Return)
    end
      

  2.   

    CREATE FUNCTION f_GetPY(@str nvarchar(4000))
    RETURNS nvarchar(4000)
    AS
    BEGIN
    DECLARE @py TABLE(
    ch char(1),
    hz1 nchar(1) COLLATE Chinese_PRC_CS_AS_KS_WS,
    hz2 nchar(1) COLLATE Chinese_PRC_CS_AS_KS_WS)
    INSERT @py SELECT 'A',N'吖',N'鏊'
    UNION  ALL SELECT 'B',N'八',N'簿'
    UNION  ALL SELECT 'C',N'嚓',N'错'
    UNION  ALL SELECT 'D',N'哒',N'跺'
    UNION  ALL SELECT 'E',N'屙',N'贰'
    UNION  ALL SELECT 'F',N'发',N'馥'
    UNION  ALL SELECT 'G',N'旮',N'过'
    UNION  ALL SELECT 'H',N'铪',N'蠖'
    UNION  ALL SELECT 'J',N'丌',N'竣'
    UNION  ALL SELECT 'K',N'咔',N'廓'
    UNION  ALL SELECT 'L',N'垃',N'雒'
    UNION  ALL SELECT 'M',N'妈',N'穆'
    UNION  ALL SELECT 'N',N'拿',N'糯'
    UNION  ALL SELECT 'O',N'噢',N'沤'
    UNION  ALL SELECT 'P',N'趴',N'曝'
    UNION  ALL SELECT 'Q',N'七',N'群'
    UNION  ALL SELECT 'R',N'蚺',N'箬'
    UNION  ALL SELECT 'S',N'仨',N'锁'
    UNION  ALL SELECT 'T',N'他',N'箨'
    UNION  ALL SELECT 'W',N'哇',N'鋈'
    UNION  ALL SELECT 'X',N'夕',N'蕈'
    UNION  ALL SELECT 'Y',N'丫',N'蕴'
    UNION  ALL SELECT 'Z',N'匝',N'做'
    DECLARE @i int
    SET @i=PATINDEX('%[吖-做]%' COLLATE Chinese_PRC_CS_AS_KS_WS,@str)
    WHILE @i>0
    SELECT @str=REPLACE(@str,SUBSTRING(@str,@i,1),ch)
    ,@i=PATINDEX('%[吖-做]%' COLLATE Chinese_PRC_CS_AS_KS_WS,@str)
    FROM @py
    WHERE SUBSTRING(@str,@i,1) BETWEEN hz1 AND hz2
    RETURN(@str)
    END
    GO
      

  3.   

    谢谢happyflystone 
    但你给的几个我都试过了,第一个函数我的查出来全是b,第二个函数查出来影响一行,但什么值都没有,第三个函数应该是有问题可能死循环了,一直在执行,正在查询.
      

  4.   

    结帖,问题解决,不是代码的问题,因为我的数据库是把sql2000里的数据库附加到sql2005中的.然后在sql2000里的数据库中新建函数,来查这样就出现了上面的哪些错误,后来我又在sql2005中新建数据库,用同样的函数查询,就没问题.