2010-07-22 91 views
1

我有下面的代碼位的SQL查詢的一部分:類型比較在SQL

INSERT INTO [Database] 
SELECT DISTINCT @ssId 
    FROM [Document_Map] 
    WHERE (LabelId IN (SELECT Tokens 
         FROM StringSplitter(@sortValue, '|', 1)) 

的代碼工作正常,只要@SortValue是一個整數,(LabelId是一個int以及)或由分隔符分隔的整數(例如,SortValue 420 | 421 |與420和421進行比較)。但是,我添加的功能涉及@sortValue的非整數值。例如:420|ABC|421|應該與420,ABC和421比較。

不用擔心,我想。我只是修改該查詢的最後一行!

(LabelId IN (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1)) OR 
StringId IN (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1))) 

不幸的是,每當我在@sortValue飼料與它的人物,我得到一個錯誤。它從來沒有達到or的最遠端。

經過大量的努力,我最終確定SQL正在將StringSplitter函數的字符串結果轉換爲與LabelId進行比較。當字符串結果保證只包含數字字符時沒有問題,但SQL拒絕將非數字字符串轉換爲int,從而拋出錯誤。

什麼是最簡單的方法來解決這個錯誤,同時保持所需的功能?由於數據庫交互,我不確定是否改變LabelId的類型是一個可行的選擇。

回答

4

擴展在什麼DCP說,試試這個代碼:

(Convert(varchar(32),LabelId) IN (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1)) OR 
StringId IN (SELECT Tokens FROM StringSplitter(@sortValue, '|', 1))) 

只要留意性能問題,WHERE子句可能會導致問題在鑄造...

+0

精彩,謝謝! – 2010-07-22 19:15:22

2

爲了您的功能性問題,嘗試ISNUMERIC :

; WITH data (Foo) AS (
      SELECT '1' 
    UNION ALL SELECT 'abc' 
) 
SELECT 
    * 
FROM data 
WHERE ISNUMERIC(Foo) = 1; 

另外,如果您的Split函數使用任何其他表(像一個普通的數字表),將分裂部出你的SELECT語句和存儲結果s在臨時表中。在語句的WHERE部分中使用模式綁定調用表值函數可以(並且通常會)爲表的每一行調用該函數。

+0

+1,不知道爲什麼有人低估。有一些好點。 – 2010-07-22 19:14:42

4

我有意見,但也問題...

的根本原因是Datatype precedence規則。

我沒有得到的是爲什麼比較字符串數據的數字列?爲什麼要發送非數字數據進行比較?

如果將int LabelID「24」轉換爲字符串與「024」字符串進行比較,則會失敗。字符串「024」變成「24」時轉換爲int雖然和匹配。你想要什麼樣的行爲?

我可以理解修復損壞的模式或使用ISNUMERIC整理數據,但您似乎故意發送字符串。

總之,你是修補程序是

  • 改變列類型來匹配你送什麼
  • CAST列
  • 過濾字符串出從比較無論是在字符串分割(如「StringSplitterToInt」 ),或在客戶端

我建議1號,以反映您的模型與實際數據或3號,以解決您的代碼...

+0

+1:打我吧,這太可怕了 – 2010-07-22 19:25:03

+0

這就是我所說的一個很好的答案! – 2010-07-22 19:33:11

+1

我是一箇舊項目的新開發人員,我得到的是以前的開發人員給我的。然而醜陋的實現可能是有效的,因爲要比較的整數永遠不會以0開始。 – 2010-07-22 19:43:51