出于某种原因,SQL不想将字符串与空格匹配

出于某种原因,SQL不想将字符串与空格匹配,sql,Sql,我有一个SQL查询没有正确比较,所以我在WHERE子句中将其注释掉。当返回AF.ActivityNote时,无论我是否对其进行RTRIM,它后面总是有2个空格。我认为这些空格是不允许注释的WHERE子句将字符串与userfield33正确匹配的问题 SELECT CAST(UF.UserField33 AS NVARCHAR) , RTRIM(CAST(AF.ActivityNote AS NVARCHAR)) FROM [BCMTEST01].[dbo].[Activity

我有一个SQL查询没有正确比较,所以我在WHERE子句中将其注释掉。当返回AF.ActivityNote时,无论我是否对其进行RTRIM,它后面总是有2个空格。我认为这些空格是不允许注释的WHERE子句将字符串与userfield33正确匹配的问题

  SELECT CAST(UF.UserField33 AS NVARCHAR) , RTRIM(CAST(AF.ActivityNote AS NVARCHAR))
        FROM [BCMTEST01].[dbo].[ActivityContacts] as AC INNER JOIN [BCMTEST01].[dbo].[ActivityFullView] as AF
            ON AC.ActivityID = AF.ActivityID INNER JOIN [BCMTEST01].[dbo].[OpportunityExportView] as OP
            ON AC.ContactID = OP.ContactServiceID INNER JOIN [BCMTEST01].[dbo].[UserFields] as UF
            ON OP.ContactServiceID = UF.ContactServiceID
            WHERE ContactID = 8376
        --WHERE  RTRIM(CAST(UF.UserField33 AS NVARCHAR) = RTRIM(CAST(AF.ActivityNote AS NVARCHAR))
        ORDER BY ContactID ASC
首先,在转换为
nvarchar
varchar
char
nchar
时,应始终包含长度。因此,请使用以下方法:

cast(uf.userfield33 as nvarchar(255)) -- or whatever length you like, so long as you have something
select ascii(right( AF.ActivityNote, 1))
最后两个字符不是空格。做一些类似于:

cast(uf.userfield33 as nvarchar(255)) -- or whatever length you like, so long as you have something
select ascii(right( AF.ActivityNote, 1))
查看字符值是什么。然后可以使用
replace
将其删除。或者,您可以只删除最后两个字符(如果这对您的应用程序有效的话)

顺便说一下,我假设您使用的是基于查询语法的SQL Server

下面是另一个
where
条款:

where (case when right(AF.ActivityNote, 2) = char(10)+CHar(13)
            then LEFT(AF.ActivityNote, LEN(AF.ActivityNote) - 2)
            else AF.ActivityNote
       end) = CAST(UF.UserField33 AS NVARCHAR(255)
我不太喜欢
where
子句中的
case
语句。我实际上会把逻辑放在一个子查询中。此外,我可能有10/13的向后顺序。

首先,在转换为
nvarchar
varchar
char
nchar
时,您应该始终包括长度。因此,请使用以下方法:

cast(uf.userfield33 as nvarchar(255)) -- or whatever length you like, so long as you have something
select ascii(right( AF.ActivityNote, 1))
最后两个字符不是空格。做一些类似于:

cast(uf.userfield33 as nvarchar(255)) -- or whatever length you like, so long as you have something
select ascii(right( AF.ActivityNote, 1))
查看字符值是什么。然后可以使用
replace
将其删除。或者,您可以只删除最后两个字符(如果这对您的应用程序有效的话)

顺便说一下,我假设您使用的是基于查询语法的SQL Server

下面是另一个
where
条款:

where (case when right(AF.ActivityNote, 2) = char(10)+CHar(13)
            then LEFT(AF.ActivityNote, LEN(AF.ActivityNote) - 2)
            else AF.ActivityNote
       end) = CAST(UF.UserField33 AS NVARCHAR(255)

我不太喜欢
where
子句中的
case
语句。我实际上会把逻辑放在一个子查询中。另外,我可能会把10/13的顺序倒过来。

你确定刺有空格吗?如果RTRIM()没有删除它们,那么它们很可能是其他一些(“不可打印”)字符。尝试一些用十六进制显示字符串的函数,或者在调试器中检查它,以确定是否有空格?如果RTRIM()没有删除它们,那么它们很可能是其他一些(“不可打印”)字符。尝试一些用十六进制显示字符串的函数,或者在调试器中检查它,以确定是否sql在服务器上。ASCII返回值为10。我无法进行替换,因为它将替换ASCI10的所有实例,但如何仅替换后续实例?@PaShKa。它们都是ASCII 10还是一个ASCII 10和另一个ASCII 13?(很好的ole ASCII回车/换行。)Gordon成功了,只需切换字符(10)和字符(13)的位置。。它的字符(13)+字符(10)是的,sql在服务器上。ASCII返回值为10。我无法进行替换,因为它将替换ASCI10的所有实例,但如何仅替换后续实例?@PaShKa。它们都是ASCII 10还是一个ASCII 10和另一个ASCII 13?(很好的ole ASCII回车/换行。)Gordon成功了,只需切换字符(10)和字符(13)的位置。。它的字符(13)+字符(10)