簡體   English   中英

為什么此查詢不起作用?

[英]Why this query doesn't work?

為什么下面的查詢在SQL Server 2008中不起作用?

SELECT 
    CONVERT(INT, TEMP.observ_value) AS value
FROM
    (SELECT observ_value 
     FROM LAB_RESULTS
     WHERE observ_value NOT LIKE '%[^0-9]%') TEMP  
WHERE 
    observ_value >= 190

這是錯誤:

消息245,第16級,狀態1,第5行
將varchar值“ SCREEN”轉換為數據類型int時,轉換失敗。

observ_value列是varchar 但是,我已經只選擇了子查詢中的int值。

不幸的是,SQL Server查詢優化器可以並且將以可能導致引入原始查詢中沒有的錯誤的方式重新排列查詢中的項目。 這在很大程度上取決於所使用的精確查詢計划,這不僅取決於表定義和查詢文本,還取決於您的值如何分配。

在您的情況下,SQL Server可能會檢查observ_value >= 190 ,將observ_value隱式轉換為int ,然后再檢查observ_value NOT LIKE '%[^0-9]%' 這是否是對查詢的有效重新排序是有爭議的,但是即使它無效,這也是SQL Server要做的事情,您必須解決。

重新編寫查詢,以確保無法將非數字值轉換為int

SELECT 
    TEMP.observ_value AS value
FROM
    (SELECT CASE
         WHEN observ_value NOT LIKE '%[^0-9]%'
         THEN CONVERT(INT, observ_value) END
         AS observ_value
     FROM LAB_RESULTS
     WHERE observ_value NOT LIKE '%[^0-9]%') TEMP  
WHERE 
    observ_value >= 190

您可以使用ISNUMERIC函數

SELECT CONVERT(INT, observ_value) AS value
    FROM LAB_RESULTS
    WHERE  ISNUMERIC(observ_value)= 1 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM