2015-01-13 59 views
0

我有兩個VIEW,我需要使用EXCEPT運算符進行比較。目的是識別兩張表的記錄是否不同。問題在於一列(例如fldIdentifierNo)可能包含外文字符集,當我使用EXCEPT運算符似乎不能正確地比較這fldIdentifierNoEXCEPT運算符不能使用外部字符集?

這是我的查詢,我也試過轉換列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'       

我比較的數據是這樣的:

EXCEPT result

這是從編輯的實際結果是:

Actual result from editor

解決 的幫助下@T_G和@VladimirBalanov,我解決了我通過發現其中一列有「硬空間」。使用LTRIM和RTRIM將不會刪除硬空間。

我使用的更換和改變硬空間是CHAR(160)(NBSP)爲CHAR(32)(空間)。 REPLACE(列,CHAR(160),CHAR(32)

這是我的問題的解決方法,但更好我會檢查爲什麼會出現在列這樣的字符

+0

首先檢查列的值是否爲真查看SSMS中的查詢結果可能會引起誤解,請嘗試'CONVERT(varbinary(8000),N'ChD /ЧД59121278')'並比較兩個表的二進制結果。 –

+0

@VladimirBaranov:看起來它們是不一樣的。正如T_G所說的那樣,我的柱子上有一個空間,我試着修剪空間,但仍然有一列保留了空間,你可能知道爲什麼它是這樣嗎? –

+1

它真的是一個空間嗎?檢查二進制值,是否爲0x20?LTRIM,RTRIM只刪除空格,不刪除其他非打印像回車或製表符的字符。 –

回答

0

請嘗試:

SELECT 
    LTRIM (RTRIM (fldIdentifierNo)) COLLATE database_default 
FROM 
    this_is_the_view_local 
WHERE 
    staff_no='00001' 
EXCEPT 
SELECT 
    LTRIM (RTRIM (fldIdentifierNo)) COLLATE database_default 
FROM 
    this_is_the_other_view 
WHERE 
    staff_no='00001' 
+0

它沒有工作。 –

+1

可能會有前導或尾隨空格的區別? –

+0

我修剪了列,它仍然是一樣的。 –

0

隨着@T_G和@VladimirBalanov的幫助下,我通過找出存在「硬空間」列上一個解決它。硬盤空間將不會被使用LTRIM和RTRIM被刪除。

我使用REPLACE並將CHAR(160)(nbsp)的硬盤空間更改爲CHAR(32)(空格)。 REPLACE(列,CHAR(160),CHAR(32)

這是我的問題的解決方法,但更好,我會檢查爲什麼會出現在列這樣的字符。