【发布时间】:2015-01-13 01:13:46
【问题描述】:
我有两个 VIEW 需要使用 EXCEPT 运算符进行比较。目的是确定两个表的记录是否不同。问题在于可能包含外来字符集的一列(例如 fldIdentifierNo),当我使用 EXCEPT 运算符时,它似乎无法正确比较 fldIdentifierNo。
这是我的查询,我还尝试将列显式转换为 NVARCHAR(MAX) 以确保它始终返回记录有差异,但无济于事。
SELECT
fldIdentifierNo -- tried it also this way CONVERT(NVARCHAR(MAX),fldIdentifierNo)
FROM
this_is_the_view_local
WHERE
staff_no='00001'
EXCEPT
SELECT
fldIdentifierNo -- tried it also this way CONVERT(NVARCHAR(MAX),fldIdentifierNo)
FROM
this_is_the_other_view
WHERE
staff_no='00001'
我比较的数据是这样的:
这是编辑器的实际结果:
已解决 在@T_G 和@VladimirBalanov 的帮助下,我发现其中一列上有“硬空间”,从而解决了这个问题。使用 LTRIM 和 RTRIM 不会删除硬空间。
我使用了 REPLACE 并将 CHAR(160) (nbsp) 的硬空间更改为 CHAR(32)(空格)。 替换(列名,CHAR(160),CHAR(32)
这是我的问题的解决方法,但更好我会检查为什么列上有这样的字符。
【问题讨论】:
-
首先检查列值是否真的相同。在 SSMS 中查看查询结果可能会产生误导。尝试
CONVERT(varbinary(8000), N'ChD/ЧД59121278')并比较两个表的二进制结果。 -
@VladimirBaranov:看起来他们不一样。正如 T_G 所说,我的专栏中有一个空格。我尝试修剪空格,但仍有一列保留了值末尾的空格。你可能知道为什么会这样吗?
-
真的是空格吗?检查二进制值,是0x20吗? LTRIM、RTRIM 只删除空格,它们不会删除其他不可打印的字符,如回车或制表符。
-
@VladimirBaranov 我解决了,列上有一个“硬空间”。我改用替换。最好检查一下为什么列上有硬空间。谢谢!
-
请考虑重新发布您的决议作为答案(并接受它)。
标签: sql-server sql-server-2008