2013-07-25 70 views
1

我正在使用SQL Server 2005.如何從SQL查詢中的NVARCHAR列中選擇整數值?

我試圖獲得值爲fk_unitserial是整數。該列被定義爲nvarchar(255), not null

認爲我在此列中選擇數值,並確定這些值使用下面的查詢是在一個特定的範圍:

select t.pkid, t.fk_unitserial 
from (
    select r.pkid, r.fk_unitserial 
    from tbl_ovenresults r 
    where isnumeric(r.fk_unitserial + '.0e0') = 1 
) t 
where convert(decimal(38, 0), t.fk_unitserial) between -2147483648 and 2147483647 
order by t.pkid 

但運行它給我的留言:

Msg 8114, Level 16, State 5, Line 1 
Error converting data type nvarchar to numeric. 

看起來像違規值是129896545820,但運行

select convert(decimal(38, 0), 129896545820) 

按預期工作。

我錯過了什麼?

編輯

我想我要問的,也許,是如果ISNUMERIC以往任何時候都不能在CONVERT(DECIMAL(38, 0), value)一起使用的值返回1

+0

違規值肯定不是129896545820,因爲我使用nvarchar列類型創建了示例表,並且提到的值和查詢運行正常。數字值之間必須有一些字符或空格。 – Sonam

+0

@Sonam - 對於使用我的'CONVERT'方法無法轉換的值,ISNUMERIC'會返回'1'嗎? – ken

+0

我不這麼認爲,Isnumeric肯定會返回0,因爲在上述條件下不能轉換的值。 – Sonam

回答

1

SQL Server保留重新排列表達式的權利,但case聲明除外。這意味着您可能會將不合格的值從子查詢傳遞到外部查詢。

有一個例外是case聲明,其中通常遵循順序評估(當涉及彙總表達式時存在星號,但這不是問題)。我會建議:

select r.pkid, r.fk_unitserial 
from tbl_ovenresults r 
where (case when r.fk_unitserial not like '[^0-9]' then convert(decimal(38, 0), t.fk_unitserial) end) 
      between -2147483648 and 2147483647 
order by t.pkid; 

作爲一個說明。 isnumeric的表達式將返回值爲'-'的值。

+0

訣竅。但是,在你的例子中,「不喜歡」應該是「like」嗎? – ken

+0

@ken。 。 。不。表達式是說「列不像一個不包含數字的模式」。好吧,這沒有意義。這實際上是說「在列中只有數字」。 –