Tsql 为什么Rtrim不清除空间(用于比较)
我有一个a列,它是一个文本字段(我知道不再使用了),我需要进行比较。(说明字段为文本字段)Tsql 为什么Rtrim不清除空间(用于比较),tsql,trim,content-length,Tsql,Trim,Content Length,我有一个a列,它是一个文本字段(我知道不再使用了),我需要进行比较。(说明字段为文本字段) 当rtrim(cast(RT.INSTRUCTIONS as varchar(max))=rtrim(cast(HQ.INSTRUCTIONS as varchar(max)),则“TRUE”或“FALSE”以指令结尾 RT.Instructions中的值是“每30小时检查一次油位” HQ.说明中的值是“每30小时检查一次油位” 为什么后面的空白不消失呢。我对这两个都做了len,并且hq比rt值小1。 我
当rtrim(cast(RT.INSTRUCTIONS as varchar(max))=rtrim(cast(HQ.INSTRUCTIONS as varchar(max)),则“TRUE”或“FALSE”以指令结尾
RT.Instructions
中的值是“每30小时检查一次油位”
HQ.说明中的值是“每30小时检查一次油位”
为什么后面的空白不消失呢。我对这两个都做了len
,并且hq
比rt
值小1。
我在varchar(60)
字段上也遇到了同样的问题。可能有一个字符没有被提取。也许以下内容将有助于找到该值。或者只是让你走上正确的道路
DECLARE @Char INT = 0
DECLARE @Tab TABLE (Id INT, Chr VARCHAR(5), Instructions VARCHAR(MAX), c VARCHAR(MAX))
WHILE @Char < = 256
BEGIN
INSERT INTO @Tab
SELECT Id
,CONVERT(NVARCHAR,CHAR(@Char)) Chr
,CONVERT(NVARCHAR,RIGHT(RTRIM(rt.Instructions),1)) InstructionChar
,CONVERT(NVARCHAR,CHAR(CONVERT(int,@Char))) c
FROM YourTable
WHERE RIGHT(RTRIM(Instructions),1) LIKE '%'+CHAR(CONVERT(int,@Char))
AND RIGHT(RTRIM(Instructions),1) NOT LIKE '[A-Za-z]'
AND RIGHT(RTRIM(Instructions),1) NOT LIKE '[0-9]'
AND RIGHT(RTRIM(Instructions),1) NOT LIKE '.'
AND RIGHT(RTRIM(Instructions),1) NOT LIKE ']'
AND RIGHT(RTRIM(Instructions),1) NOT LIKE ')'
AND RIGHT(RTRIM(Instructions),1) NOT LIKE '"'
AND RIGHT(RTRIM(Instructions),1) NOT LIKE '}'
AND RIGHT(RTRIM(Instructions),1) NOT LIKE '/'
SET @Char = @Char + 1
END
SELECT DISTINCT *
FROM @Tab
DECLARE@Char INT=0
声明@Tab表(Id INT,Chr VARCHAR(5),指令VARCHAR(MAX),c VARCHAR(MAX))
而@Char<=256
开始
插入@Tab
选择Id
,CONVERT(NVARCHAR,CHAR(@CHAR))Chr
,转换(NVARCHAR,右(RTRIM(rt.Instructions),1))指令CHAR
,CONVERT(NVARCHAR,CHAR)(CONVERT(int,@CHAR)))c
从你的桌子上
其中RIGHT(RTRIM(指令),1)类似“%”+CHAR(CONVERT(int,@CHAR))
右(RTRIM(指令),1)不像“[A-Za-z]”
右(RTRIM(指令),1)与“[0-9]”不同
对(RTRIM(说明),1)不象“.”
和右(RTRIM(说明),1)不象']'
和右(RTRIM(说明),1)不象''
和右(RTRIM(说明),1)不象“'
右(RTRIM(指令),1)不象“}”
右(RTRIM(说明),1)不象“/”
设置@Char=@Char+1
结束
选择不同的*
来自@Tab
对不起:我还不能写评论
第一次尝试:
Case when left(rtrim(cast(RT.INSTRUCTIONS as varchar(max))),len(HQ.INSTRUCTIONS)) = rtrim(cast(HQ.INSTRUCTIONS as varchar(max))) then 'TRUE' Else 'FALSE' end as INSTRUCTIONS
检查是否与其他问题无关
然后做:
SELECT ASCII(right(RT.INSTRUCTIONS,1))
要确认跟踪空间是“真实”空间:此查询应显示32
字符(32)=>“
ASCII(“”)=>32
我打赌你会得到16度。160意味着最后一个字符是一个不间断的空格,它不关心修剪功能
如果是这样,则必须构建标量函数,如:
ALTER FUNCTION [dbo].[fn_Replace_NonBreakingSpace]
(
@InputString varchar(max),
)
RETURNS varchar(MAX)
AS
BEGIN
RETURN REPLACE(@InputString, char(160), char(32))
END
然后:
Case when rtrim(dbo.fn_Replace_NonBreakingSpace(RT.INSTRUCTIONS)) = rtrim(dbo.fn_Replace_NonBreakingSpace(HQ.INSTRUCTIONS)) then 'TRUE' Else 'FALSE' end as INSTRUCTIONS
您使用的是什么数据库管理系统?数据库是Tsql 2008您确定它是一个空格字符(32)而不是其他控制字符吗?我没有看到除“空白”“空”空格以外的任何值在末尾替换为“看看你是否还有空格…如果你这样做,它不是一个空格,而是其他一些非显示字符。。。您可以在句点后的每个字符上使用ASCII来计算它。可能是一个标签,硬返回等。。。