数据库版本:vs2005和vs2008
问题描述:现在数据库中有一张表User(id,name),其中name列中既有半角又有全角。
请问怎么将全角的名字转换成半角?

解决方案 »

  1.   

    /*=============================================*/
    /* Author: roy_88 */--2 实现全角与半角字符转换的处理函数
    CREATE FUNCTION f_Convert(
    @str NVARCHAR(4000), --要转换的字符串
    @flag bit              --转换标志,0转换成半角,1转换成全角
    )RETURNS nvarchar(4000)
    AS
    BEGIN
        DECLARE @pat nvarchar(8),@step int,@i int,@spc int
        IF @flag=0
            SELECT @pat=N'%[!-~]%',@step=-65248,
                @str=REPLACE(@str,N' ',N' ')
        ELSE
            SELECT @pat=N'%[!-~]%',@step=65248,
                @str=REPLACE(@str,N' ',N' ')
        SET @i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str)
        WHILE @i>0
            SELECT @str=REPLACE(@str,
                    SUBSTRING(@str,@i,1),
                    NCHAR(UNICODE(SUBSTRING(@str,@i,1))+@step))
                ,@i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str)
        RETURN(@str)
    END
    GOdeclare T_cursor cursor local for
    select 
        a.Name,    b.Name 
    from 
        sysobjects a 
    join 
        syscolumns b on a.ID=b.ID
    join 
        systypes c on c.xusertype=b.Xtype
    where
        a.xtype='U' and c.Name in('nvarchar','nchar','varchar','char')
    declare @tabName sysname,@ColName sysname
    open T_cursor
    fetch next from T_cursor into @tabName,@ColName
    while @@fetch_status=0
    begin 
        exec('update '+@tabName+' set '+@ColName+'=dbo.f_Convert('+@ColName+',0) where PATINDEX(N''%[!-~]%'' COLLATE LATIN1_GENERAL_BIN'+','+@ColName+')>0'
        fetch next from T_cursor into @tabName,@ColName
    end
    close T_cursor
    deallocate T_cursor-----------------------------------------改列的数据全角为半角
    declare T_cursor cursor local for
    select 
        a.Name,    b.Name 
    from 
        sysobjects a 
    join 
        syscolumns b on a.ID=b.ID
    join 
        systypes c on c.xusertype=b.Xtype
    where
        a.xtype='U' and c.Name in('nvarchar','nchar','varchar','char')
    declare @tabName sysname,@ColName sysname
    open T_cursor
    fetch next from T_cursor into @tabName,@ColName
    while @@fetch_status=0
    begin 
        exec('update '+@tabName+' set '+@ColName+'=dbo.f_Convert('+@ColName+',0) where PATINDEX(N''%[!-~]%'' COLLATE LATIN1_GENERAL_BIN'+','+@ColName+')>0')--少了)
        fetch next from T_cursor into @tabName,@ColName
    end
    close T_cursor
    deallocate T_cursor
    go
    --改列名全角为半角
    declare T_cursor cursor local for
    select 
        a.Name,    b.Name 
    from 
        sysobjects a 
    join 
        syscolumns b on a.ID=b.ID
    where
        a.xtype='U' and PATINDEX(N'%[!-~]%' COLLATE LATIN1_GENERAL_BIN,b.Name)>0
    declare @tabName sysname,@ColName sysname
    open T_cursor
    fetch next from T_cursor into @tabName,@ColName
    while @@fetch_status=0
    begin 
        exec('exe sp_rename '''+@tabName+'.'+@ColName+''',''dbo.f_Convert('+@ColName+',0)''')
        fetch next from T_cursor into @tabName,@ColName
    end
    close T_cursor
    deallocate T_cursor------------------------------------------------------
    --改列名全角为半角
    declare T_cursor cursor local for
    select 
        a.Name+'.'+b.Name,NameNew=dbo.f_Convert(b.Name)
    from 
        sysobjects a 
    join 
        syscolumns b on a.ID=b.ID
    where
        a.xtype='U' and PATINDEX(N'%[!-~]%' COLLATE LATIN1_GENERAL_BIN,b.Name)>0
    declare @tabName sysname,@ColName sysname
    open T_cursor
    fetch next from T_cursor into @tabName,@ColName
    while @@fetch_status=0
    begin 
        exe sp_rename @tabName,@ColName
        fetch next from T_cursor into @tabName,@ColName
    end
    close T_cursor
    deallocate T_cursor
      

  2.   

    用这个简单些.实现全角与半角字符转换的处理函数
    CREATE FUNCTION f_Convert(
    @str NVARCHAR(4000), --要转换的字符串
    @flag bit              --转换标志,0转换成半角,1转换成全角
    )RETURNS nvarchar(4000)
    AS
    BEGIN
        DECLARE @pat nvarchar(8),@step int,@i int,@spc int
        IF @flag=0
            SELECT @pat=N'%[!-~]%',@step=-65248,
                @str=REPLACE(@str,N' ',N' ')
        ELSE
            SELECT @pat=N'%[!-~]%',@step=65248,
                @str=REPLACE(@str,N' ',N' ')
        SET @i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str)
        WHILE @i>0
            SELECT @str=REPLACE(@str,
                    SUBSTRING(@str,@i,1),
                    NCHAR(UNICODE(SUBSTRING(@str,@i,1))+@step))
                ,@i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str)
        RETURN(@str)
    END
    GO
      

  3.   

    if   exists   (select   *   from   dbo.sysobjects   where   id   =   object_id(N'[dbo].[f_convert]')   and   xtype   in   (N'FN',   N'IF',   N'TF'))   
      drop   function   [dbo].[f_convert]   
      GO   
        
      /*--全角/半角转换   
        
      转换说明   
      全角字符从的unicode编码从65281~65374   
      半角字符从的unicode编码从       33~126   
      空格比较特殊,全角为   12288,半角为   32   
      而且除空格外,全角/半角按unicode编码排序在顺序上是对应的   
      所以可以直接通过用+-法来处理非空格数据,对空格单独处理   
      like的时候,指定排序规则   COLLATE   Latin1_General_BIN   
      是保证字符顺序按unicode编码排序   
      (此函数部分思路参考了CSDN上大力的转换函数)   
      --邹建   2005.01(引用请保留此信息)--*/   
        
      /*--调用示例   
        
      declare   @s1   varchar(8000)   
      select   @s1='中    2-3456a78STUVabn中国opwxyz'   
      select   dbo.f_convert(@s1,0),dbo.f_convert(@s1,1)   
      --*/   
      CREATE   FUNCTION   f_Convert(   
      @str   NVARCHAR(4000),   --要转换的字符串   
      @flag   bit                         --转换标志,0转换成半角,1转换成全角   
      )RETURNS   nvarchar(4000)   
      AS   
      BEGIN   
      DECLARE   @pat   nvarchar(8),@step   int,@i   int,@spc   int   
      IF   @flag=0   
      SELECT   @pat=N'%[!-~]%',@step=-65248,   
      @str=REPLACE(@str,N' ',N'   ')   
      ELSE   
      SELECT   @pat=N'%[!-~]%',@step=65248,   
      @str=REPLACE(@str,N'   ',N' ')   
      SET   @i=PATINDEX(@pat   COLLATE   LATIN1_GENERAL_BIN,@str)   
      WHILE   @i>0   
      SELECT   @str=REPLACE(@str,   
      SUBSTRING(@str,@i,1),   
      NCHAR(UNICODE(SUBSTRING(@str,@i,1))+@step))   
      ,@i=PATINDEX(@pat   COLLATE   LATIN1_GENERAL_BIN,@str)   
      RETURN(@str)   
      END   
      GO   
      

  4.   

    汗 直接使用函数啊
    select   dbo.f_convert(列名,0),dbo.f_convert(列名,1)
      

  5.   

    兄弟,你得去调用函数.我们上面给你的是函数.create table tb(col nvarchar(20))
    insert into tb values(N'全角')
    insert into tb values(N'半角')go
    CREATE FUNCTION f_Convert(
    @str NVARCHAR(4000), --要转换的字符串
    @flag bit              --转换标志,0转换成半角,1转换成全角
    )RETURNS nvarchar(4000)
    AS
    BEGIN
        DECLARE @pat nvarchar(8),@step int,@i int,@spc int
        IF @flag=0
            SELECT @pat=N'%[!-~]%',@step=-65248,
                @str=REPLACE(@str,N' ',N' ')
        ELSE
            SELECT @pat=N'%[!-~]%',@step=65248,
                @str=REPLACE(@str,N' ',N' ')
        SET @i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str)
        WHILE @i>0
            SELECT @str=REPLACE(@str,
                    SUBSTRING(@str,@i,1),
                    NCHAR(UNICODE(SUBSTRING(@str,@i,1))+@step))
                ,@i=PATINDEX(@pat COLLATE LATIN1_GENERAL_BIN,@str)
        RETURN(@str)
    END
    GOselect col 转换前 , dbo.f_Convert(col , 0) 转换后 from tbdrop table tb
    drop function dbo.f_Convert/*转换前                  转换后  
    -------------------- ----------
    全角                   全角
    半角                   半角(所影响的行数为 2 行)
    */
      

  6.   

    这个可以 ,亲测
    select candidate_name,dbo.f_Convert(requirement_alias,0) from interview_record 
    update interview_record set requirement_alias=dbo.f_Convert(requirement_alias,0)