在SQL Server 2008 R2上編寫Sql命令時出現問題。
事實是,我有數字和nvarchar數據存儲在同一列(IMP_VALUE)。 當我嘗試執行此命令SQL Server - SQL由於多數據類型而選擇問題子句
Select count(*)
from IMPORTBM
inner join ATTRIBUTE on ATT_ATTRIBUTE_ID = IMP_ATTRIBUTE_ID
where IMP_LOCATION_ID = 1
AND IMP_SERIAL_ID = 58
AND IMP_VERSION_ID = 1
AND
((ATT_ATTRIBUTE = 'GBHT' AND IMP_VALUE = 'NA')
OR (ATT_ATTRIBUTE = 'GBLOPK' AND IMP_VALUE = 'NA')
OR (ATT_ATTRIBUTE = 'BRGLWLNG' AND IMP_VALUE = 0.603)
OR (ATT_ATTRIBUTE = 'MSZ' AND IMP_VALUE IN ('LMV-321','LMV-322'))
OR (ATT_ATTRIBUTE = 'GBACCK' AND IMP_VALUE IN ('NA','WARNING_NoValueFound'))
OR (ATT_ATTRIBUTE = 'GBTHLWLOC' AND IMP_VALUE IN ('NA','WARNING_NoValueFound')))
,它失敗,出現錯誤:
消息8114,級別16,狀態5,行1
錯誤的數據類型爲varchar轉換爲數字。
當然,我爲了使這項工作
CAST(IMP_VALUE as numeric) = 0.603
改變這一點,但事實並非如此。
當我只執行命令的第一部分,一切工作正常
Select count(*)
from IMPORTBM
inner join ATTRIBUTE on ATT_ATTRIBUTE_ID = IMP_ATTRIBUTE_ID
where IMP_LOCATION_ID = 1
AND IMP_SERIAL_ID = 58
AND IMP_VERSION_ID = 1
AND
((ATT_ATTRIBUTE = 'GBHT' AND IMP_VALUE = 'NA')
OR (ATT_ATTRIBUTE = 'GBLOPK' AND IMP_VALUE = 'NA')
OR (ATT_ATTRIBUTE = 'BRGLWLNG' AND CAST(IMP_VALUE as numeric) = 0.603))
但是,當我加入where
最後3行:
OR (ATT_ATTRIBUTE = 'MSZ' AND IMP_VALUE IN ('LMV-321','LMV-322'))
OR (ATT_ATTRIBUTE = 'GBACCK' AND IMP_VALUE IN ('NA','WARNING_NoValueFound'))
OR (ATT_ATTRIBUTE = 'GBTHLWLOC' AND IMP_VALUE IN ('NA','WARNING_NoValueFound')))
,它無法與同錯誤代碼比以前!
有人知道爲什麼它只能在沒有in
行的情況下工作嗎?
另外,你有什麼可以使這項工作?
非常感謝!
如果你的領域是VARCHAR,那麼你爲什麼不這樣做'AND IMP_VALUE =「0.603''?這可以避免查詢在與'0.603'比較之前嘗試將其中的'NA'行轉換爲NUMERIC ... – MatBailie
因爲我可以使用多個運算符(例如>,< > =,<=,in,不在,之間),而這個where子句是動態的,它根據我的用戶需要創建數字和varchar值。 (我不確定是否清楚,我的英語很差...) – KrasshX
然後你依靠短路;當ATT_ATTRIBUTE ='BRGLWLNG''條件失敗時,優化器知道不應用'CAST(IMP_VALUE AS NUMERIC)'。由於WHERE子句的複雜性導致短路失敗,或者即使在ATT_ATTRIBUTE ='BRGLWLNG'時,IMP_VALUE中的值也不是數值。 – MatBailie