我在网上下了一个FUNCTION,测试没问题,但是用真实数据时,报错,
报错信息:String or binary data would be truncated.
The statement has been terminated.报错的数据:EXPEDITORS   CARGO   MANAGEMENT   SYSTEM   O/B   DALIAN   EVERSHIINE   INTERNATIONAL   TRADE   CO.,LTD.请高手帮我看看怎么回事?
alter    FUNCTION   [dbo].[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

解决方案 »

  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
    select dbo.f_convert('EXPEDITORS CARGO MANAGEMENT SYSTEM O/B DALIAN EVERSHIINE INTERNATIONAL TRADE CO.,LTD.',1)
    drop function f_convert
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
    EXPEDITORS CARGO MANAGEMENT SYSTEM O/B DALIAN EVERSHIINE INTERNATIONAL TRADE CO.,LTD.(所影响的行数为 1 行)
      

  2.   

    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   
      

  3.   

    /*=============================================*/
    /* 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