使用MS SQL 2008替换ASCII字符

时间:2014-10-22 14:49:44

标签: sql-server regex sql-server-2008

这里已经触及了这一点,但我尝试过的所有例子都无效

我有一个nvarchar字段,其中包含一个或多个< 32和/或>这导致我的查询返回的次数减少了。我已经尝试了REPLACE([描述],'[^ \ x20- \ x7E]','XX')AS NewDescription,它没有用。我已经读过你不能在sql语句中使用正则表达式。?或者我没有正确使用正则表达式。

要求: MS SQL 2008 只能使用将在脚本中运行的内容。所以没有函数或存储过程。 我无法控制即将进入的数据。 必须在选择级别和where级别固定字符。

2 个答案:

答案 0 :(得分:1)

不,你不能在SQL中使用REGEX。太糟糕了,你不能写一个函数,但你可以在一个函数中使用的代码可以在脚本中使用,它只会是丑陋的。遍历字符串中的字符并检查每个字符的ASCII()值,看它是否在32-127范围内,并根据需要替换或省略。

如果在结果集的上下文中执行此操作,则需要使用游标,以便可以填充varchar变量并循环遍历变量中的字符。这就是为什么它作为一个函数会更漂亮。

答案 1 :(得分:1)

你需要为这样的字符串操作编写一个函数。这是替换所有这些字符的示例代码

您也可以使用CLR功能执行此类操作,因为它会更快。

    declare @string nvarchar(256) 

    DECLARE @r  NVARCHAR(256) = N''
    DECLARE @len INT = LEN(@string)
    DECLARE @i   INT = 1

    WHILE @i <= @len BEGIN
        DECLARE @char NCHAR(1) = SUBSTRING(@string, @i, 1)
        IF(UNICODE(@char) < 0x20) AND UNICODE(@char) > 0x7e
            SET @r += 'XX' 
        ELSE
            SET @r += @char
        SET @i += 1
    END
    SELECT @r