这里已经触及了这一点,但我尝试过的所有例子都无效
我有一个nvarchar字段,其中包含一个或多个< 32和/或>这导致我的查询返回的次数减少了。我已经尝试了REPLACE([描述],'[^ \ x20- \ x7E]','XX')AS NewDescription,它没有用。我已经读过你不能在sql语句中使用正则表达式。?或者我没有正确使用正则表达式。
要求: MS SQL 2008 只能使用将在脚本中运行的内容。所以没有函数或存储过程。 我无法控制即将进入的数据。 必须在选择级别和where级别固定字符。
答案 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