2017-01-18 107 views
0

我有這樣SQL服務器:轉換轉換爲varchar值 '1,2' 失敗時

select 
    t.tiid, t.employeeid, t.remarks, 
    dd.DocID, dd.Document, dd.DocuName 
from 
    ti t 
inner join 
    History cth on cth.tiid = t.tiid 
inner join 
    Downloads dd on dd.DocID = cth.DocID 

我在表中的數據是這樣的

歷史查詢:

DocID   DocuName 
1,2    abc.dox,def.docx 

下載

DocID DocuName   document 
1  abc.docx   x3400000efg.. 
2  def.docx   xc445560000... 

,但是當我執行此查詢時,它顯示了一個錯誤:

Conversion failed when converting the varchar value '1,2' to data type int.

+6

你應該重新設計你的歷史表的東西。爲什麼你要在單行中存儲應該在不同行中逗號分隔的值? –

回答

3

歷史的的DocID是多重的DocID已經結合逗號,所以你不能直接比較值(一個值VS多個值)。

您可以檢查多個值是否包含指定值use CHARINDEX。

爲確保完全匹配子字符串,需要使用分隔符來表示單個值,否則會得到錯誤的結果。 例如: CHARINDEX('1,','12,2,3')將爲1,但事實上,字符串中沒有1。

select 
t.tiid, 
t.employeeid, 
t.remarks, 
dd.DocID, 
dd.Document, 
dd.DocuName 
from ti t 
inner join History cth on cth.tiid=t.tiid 
inner join Downloads dd on CHARINDEX(','+LTRIM(dd.DocID)+',',','+cth.DocID+',')>0 
+1

Upvoted用於CHARINDEX使用。但是,你能解釋CharIndex的邏輯而不是代碼嗎? –

0

由於錯誤說,您要等同於int.You字符串需要爲int的DocID轉換爲字符串,並檢查它是否存在於逗號分隔的DocID .Something像

SELECT t.tiid, 
     t.employeeid, 
     t.remarks, 
     dd.DocID, 
     dd.Document, 
     dd.DocuName 
FROM ti t 
INNER JOIN History cth ON cth.tiid=t.tiid 
INNER JOIN Downloads dd ON CHARINDEX(',' + CAST(dd.DocID AS VARCHAR(10)) + ',',',' + cth.DocID + ',')>0 
相關問題