2013-06-27 104 views
-1

我一直在試圖運行下面的程序,我不斷收到錯誤連接問題:將數據類型nvarchar轉換爲float時出錯?

錯誤轉換數據類型爲nvarchar浮動

SQL:

SELECT 
    distinct 
    coalesce(a.File_NBR,b.File_NBR) as ID, 
    b.Division, 
    b.Program, 
    a.Full_Name, 
    a.SBC_RESULT 
FROM 
    New_EEs.dbo.vw_SBC_RESULTS a 
full join 
    New_EEs.dbo.vw_SBC_Employee_Info b on a.File_NBR = b.File_NBR 
where 
    (a.File_NBR is not null OR b.File_NBR is not null) 
    and A.Full_Name is not null 
order by 
    a.Full_Name, b.Division, b.Program 

當我發表評論out/*和A.Full_Name不爲空* /程序起作用。

我想不出有什麼錯誤的手段和爲什麼當我註釋掉/ 聯接作品*和A.Full_Name不爲空*/

任何反饋表示讚賞。

謝謝!

+0

你嘗試小寫字母「A」 a.Full_Name –

+0

是File_NBR數據類型參與加入基本表之間有什麼不同? – mwigdahl

+0

嗨。我只是變成了小寫字母,仍然沒有工作。是的,File_NBR的數據類型可能不同,我將如何編寫 - 我是SQL服務器的新手 – user2270911

回答

4

錯誤消息清楚地表明該問題與將nvarchar轉換爲float的問題有關。在查詢中沒有明確的轉換,因此它是關於隱含的轉換。如果問題確實來自於此特定查詢而不是來自其他地方,則只有兩個地方可以對此負責:

1)連接謂詞;

2)COALESCE調用。

這兩個地方都涉及同一對列,a.File_NBRb.File_NBR。所以,其中一個必須nvarchar列,另一個是float之一。由於float類型的優先級高於nvarchar,因此後者會隱式轉換爲前者,而不是其他方式。顯然其中一個字符串值未能轉換。這是對即時問題的解釋(轉換)。

我看過您的評論,您說的其中一欄是int,另一欄是float。我沒有問題,因爲我相信你在討論物理表格中的列,而這個查詢中的兩個來源都是視圖,根據他們的名字來判斷。我相信其中一列在視圖中享有轉換爲nvarchar,並且此查詢最終會以此方式查看。所以,那應該是你在nvarchar來自哪裏的原因。

至於說明爲什麼評論一個看似不相關的條件似乎造成如此大的差異,答案肯定在查詢規劃者的內部工作中。雖然在Transact-SQL SELECT查詢中有一個documented order of logical evaluation子句,但實際的物理順序可能與此不同。爲查詢選擇的實際計劃確定了物理順序。特別是,一個計劃的選擇可能會受到影響,特別是通過併入或消除一個簡單條件這樣的小事。

要將這種情況應用於您的情況,當有問題的條件被註釋掉時,計劃員爲查詢選擇一個計劃,即僅當所有能夠引起相關問題的行都能夠評估連接謂詞和COALESCE表達式已被基礎視圖中的謂詞過濾掉。但是,如果條件被放回,查詢將被分配一個不同的執行計劃,並且COALESCE或(更可能)連接謂詞最終應用於包含無法轉換爲浮點的字符串的行,這會導致引發了一個例外。

如同您所做的那樣,將a.File_NBRb.File_NBR轉換爲char是解決此問題的一種方法。你可以在事實上挑這四個字符串類型的任何:

  • char

  • varchar

  • nchar

  • nvarchar

由於其中一列已經是一個字符串(可能是a.File_NBR之一,但您可以更準確地找到該字符串),因此該轉換可能僅適用於另一列。

或者,您可以查看生成nvarchar列的視圖,以試試看看intnvarchar轉換是否可以首先消除。

+0

非常感謝!這是一個很好的解釋! – user2270911

+0

+1,很棒的作品。 –

0

請參閱此example,也許會有用。

CREATE TABLE TEST(
ID FLOAT) 

INSERT INTO TEST(ID) VALUES(NULL) 
INSERT INTO TEST(ID) VALUES(12.3) 

--SELECT COALESCE(ID,'TEST') FROM TEST; NOT WORKING ERROR:Error converting data type nvarchar to float 
SELECT COALESCE(CAST(ID AS VARCHAR),'TEST') FROM TEST; --WORKS 
相關問題