我必须修剪日语字符串,该字符串在字符串的开头和结尾都具有双字节空间。 我必须通过SQL Server 2016的过程来执行此操作。
例如,
SELECT LTRIM(RTRIM(' A A '))
以上是完美的
但是问题出在波纹管
SELECT LTRIM(RTRIM(' A A '))
我希望以上输出为'A A'
有什么想法,怎么做?
答案 0 :(得分:1)
该字符串中的空格是Ideographic space(U + 3000)Unicode字符,LTRIM和RTRIM不能将其识别为空格。除非明确指定,否则即使SQL Server 2017中的TRIM也无法识别它。
另一个问题是该字符超出了正常字符范围,并且不能出现在varchar
字段或值中。这会导致SQL Server版本之间的结果不一致。在SQL Server 2014中,它甚至会显示为?
。在更高的版本中,LTRIM / RTRIM可能会或可能不会不发出错误字符而工作。我无权访问所有版本进行测试。
在SQL Server 2017中,可以显式指定修剪后的字符,例如:
select trim(N' ' from N' A A ')
这将产生A A
。
在以前的版本中,PATINDEX
可用于查找第一个和最后一个非空格位置的位置:
declare @str nvarchar(10)=N' A A ';
declare @start int=PATINDEX(N'%[^ ]%',@str)
declare @end int=PATINDEX(N'% ',@str)
SELECT SUBSTRING(@str,@start,@end-@start)
模式N'%[^ ]%'
查找字符串中的第一个非U + 3000字符。 N'%'找到最后一个的位置。 SUBSTRING(@str,@start,@end-@start)
提取两个位置之间的内容。
结果是:
A A
答案 1 :(得分:0)
答案 2 :(得分:0)
我找到了解决方案 非常感谢您的努力。 请使用此功能删除双字节空间。
创建函数[RTRIMBYTE](@ AV_VALUE NVARCHAR(MAX)) 返回NVARCHAR(MAX) 如 开始
DECLARE @AV_RETURN NVARCHAR(MAX) = @AV_VALUE;
WHILE DATALENGTH(@AV_RETURN) > 0 AND RIGHT(@AV_RETURN, 1) in (' ', ' ')
SET @AV_RETURN = LEFT(@AV_RETURN, LEN('X' + @AV_RETURN + 'X') -3 ) ;
RETURN @AV_RETURN;
END;