2013-11-21 294 views
0

我有如下所示的sql。主頁提示:將varchar值'ADMIN'轉換爲數據類型int時出現轉換失敗int

的結果K表(來自WITH)給出指定範圍(例如1-90)的數字代碼。

主要選擇部分正常工作,直到我用

sum(F._IsInIntersection) [CountIntersection] 

它會導致錯誤

消息245,級別16,狀態1,11號線
轉換爲varchar時 轉換失敗值'ADMIN'爲數據類型int。

如果我評論這一行,那就OK了。

我不知道,爲什麼這個錯誤發生在SUM()只包含int值的行。沒有ADMIN值(如錯誤中提到的)存在於任何地方...

任何人都可以看到查詢的任何問題?

;with K as ( 
select cast(c.Code as int) code 
from rmCategory c, rmCategoryGroup cg, rmIdentification ic 
where 1=1 
    and c.CategoryGroupID=cg.ID 
    and c.ID=ic.ID0 
) 

select 
F.STAV_AKT [Code] 
, count(F.STAV_AKT) [Count] 
, sum(F._IsInIntersection) [CountIntersection] 

from 
(
select 
    f.* 
    , case when f.KVALIF IN (select code from K) and f.KVALIF is not null then 1 else 0 end _IsInIntersection 
from frmFormData_208629_MaMo2_IMPORT f, rmIdentification i 

where 1=1 
    and f.ID=i.id0 
    and i.isValid=1 
    and f.sysDAVKA=5 

) F 

group by F.STAV_AKT 
order by F.STAV_AKT 

我也嘗試過鑄造的sum(cast(F._IsInIntersection as int)) [CountIntersection]內部參數,以確保使用的,而不是布爾類型的國際價值,但沒有任何變化。

回答

1

馬丁,我懷疑c.Code也包含了一部分的值「ADMIN」

cast(c.Code as int) code 

它在運行時的總和,因爲它是一個CTE的一部分,當列不是不兌現好用過的。

舉例來說,如果我運行Fiddle它運行良好,但如果我也選擇了列Code它試圖投「管理」到INT(Fiddle)時失敗,下面的代碼示例。

;WITH cte as 
(
    select CAST(a AS INT) AS Code 
      ,'Dummy' AS Column2 
    FROM (
      SELECT 1 AS a 
      UNION ALL SELECT 'a' 
     ) t 
) 
SELECT Column2 
    --,Code 
FROM cte 

所以試圖通過使用如要弄清楚究竟爲Code列中的值

SELECT DISTINCT Code FROM rmCategory 
+0

聲明的CTE - 「K」是不是在隨後的'SELECT'語句中使用 – Raj

+1

是的,它在CASE表達式中子選擇F是:'給K選擇代碼' – NickyvV

+0

謝謝。錯過了。 – Raj

0

f.sysDAVKA的數據類型是什麼?

嘗試運行

SELECT f.sysDAVKA 
FROM frmFormData_208629_MaMo2_IMPORT f 
WHERE f.sysDAVKA = 'ADMIN' 

我的直覺是,你會發現至少有一行。如果這是真的,那麼更改您的WHERE子句爲

where 1=1 
    and f.ID=i.id0 
    and i.isValid=1 
    and f.sysDAVKA=CAST(5 AS char(1)) 

應該解決問題。

+0

sysDAVKA是「int」列 – procma

相關問題