Tsql 为什么Rtrim不清除空间(用于比较)

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。 我

我有一个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。
我在
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来计算它。可能是一个标签,硬返回等。。。