[英]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.