壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 910|回复: 0

[SQL Server数据库] 利用游标去除表中所有非法字符

[复制链接]
发表于 2013/7/26 14:41:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
我们经常会碰到表中存在非法字符导致软件中显示格式错位异常的情况,对此我们可以利用游标快速的实现去除表中非法字符的操作。--作用:去除指定表中数据类型是VARCHAR,CHAR,NVARCHAR的字段值中的不可见字符
--注意:使用前请指定对应要修改的表名,并且需要在对应数据库下执行;
SET NOCOUNT ON
DECLARE    @TblName     VARCHAR(100)
DECLARE    @UpdateString    NVARCHAR(1000)
DECLARE    @SelectString    NVARCHAR(1000)
DECLARE    @COlName    VARCHAR(100)
DECLARE @COUNT        INT
SET    @TblName = 'ia_subsidiary'--指定想要修改的表名
--定义游标取出指定表内的数据类型是VARCHAR,char,nVARCHAR的字段名称
DECLARE    cur_ColName     CURSOR
FOR
SELECT    col.name
FROM    syscolumns AS col
    inner join sysobjects     AS obj     ON col.ID = obj.ID
    INNER join systypes     AS typ     ON col.xtype = typ.xtype
WHERE    obj.xtype ='U'
AND    obj.name = @TblName
AND    typ.name IN ('VARCHAR','CHAR','NVARCHAR','NCHAR')
FOR    READ ONLY
--打开游标
OPEN    cur_ColName
FETCH    NEXT    FROM    cur_ColName INTO    @ColName
IF    @@FETCH_STATUS<>0
BEGIN
    PRINT '没有对应表或字段,'
    PRINT '请确认当前数据库内有' + @TblName + '表,'
    PRINT '或该表内有VARCHAR、CHAR、NVARCHAR、NCHAR类型的字段!'
    GOTO LABCLOSE
END
--循环修改
WHILE    @@FETCH_STATUS=0
BEGIN   
    --拼修改字符串
    --去掉左边的不可见字符
    SET    @SelectString =    'SELECT    @COU=COUNT(*)   
                 FROM    ' + @TblName +'
                WHERE    ASCII(LEFT(' + @ColName +',1))<32
                AND    '+ @ColName + ' IS NOT NULL'
   
    EXEC sp_executesql @SelectString,N'@COU INT OUTPUT',@COUNT OUTPUT
    WHILE    @COUNT>0
    BEGIN
        SET    @UpdateString =
            '    UPDATE    ' + @TblName +
            '    SET    ' + @ColName + '=RIGHT(' + @ColName + ',LEN(' + @ColName + ')-1)
                WHERE    ASCII(LEFT(' + @ColName + ',1))<32
                AND    ' + @ColName + ' IS NOT NULL'
   
        EXEC sp_executesql @UpdateString   
        EXEC sp_executesql @SelectString,N'@COU INT OUTPUT',@COUNT OUTPUT
    END
    --去掉右边的不可见字符
    SET    @SelectString =    'SELECT    @COU=COUNT(*)   
                 FROM    ' + @TblName +'
                WHERE    ASCII(RIGHT(' + @ColName +',1))<32
                AND    '+ @ColName + ' IS NOT NULL'
   
    EXEC sp_executesql @SelectString,N'@COU INT OUTPUT',@COUNT OUTPUT
    WHILE    @COUNT>0
    BEGIN
        SET    @UpdateString =
            '    UPDATE    ' + @TblName +
            '    SET    ' + @ColName + '=LEFT(' + @ColName + ',LEN(' + @ColName + ')-1)
                WHERE    ASCII(RIGHT(' + @ColName + ',1))<32
                AND    ' + @ColName + ' IS NOT NULL'
   
        EXEC SP_EXECUTESQL @UpdateString   
        EXEC sp_executesql @SelectString,N'@COU INT OUTPUT',@COUNT OUTPUT
    END
    PRINT 'column:  ' + @ColName + '---ok'
    FETCH    NEXT FROM cur_ColName    INTO    @ColName
END
--关闭、释放游标
LABCLOSE:    CLOSE    cur_ColName
        DEALLOCATE    cur_ColName


您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2022/6/29 15:45 , Processed in 0.009134 second(s), 6 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表