2010-05-07 51 views
0

消息8114,級別16,狀態5,過程spGetDetails,線88
誤差變換數據類型爲varchar到數字。轉換數據類型爲varchar到數字

我已經將此@mfr_id轉換爲int類型,然後也收到上述錯誤。

我在執行存儲過程時出錯。

其中我得到錯誤的路線是:

if(@mfr_id = 5) 
+0

什麼是@ mfr_id變量聲明爲? – 2010-05-07 16:27:08

+0

@OMG Ponies「@mfr_id是varchar,但其存儲1 2,3,4」。從評論到我的答案。 – 2010-05-07 16:28:35

回答

2

使用:

if(@mfr_id = '5') 

值比較必須是相同的數據類型,或必須有隱式的數據類型轉換。顯式轉換 - 當您使用CAST/CONVERT時 - 是維護的理想選擇,因爲操作很明顯。

根據您的需要,ISNUMERIC功能可能會有所幫助。並且要小心地爲你的[n] varchar變量定義一個長度。

1

更新答案

如此看來,@mfr_id是一個varchar。爲了避免語法問題,請使用OMG Ponies文章中的答案。

但你也說它存儲字符串「1 2,3,4 .....」。所以語義上你想IF語句如果包含值'5'是真的?

如果是這樣,你可能需要像這樣

set @mfr_id = REPLACE(@mfr_id, ' ','') 
if ((@mfr_id LIKE '5,%') OR (@mfr_id LIKE '%,5,%') OR (@mfr_id LIKE '%,5')) 

原來的答案 - 過時

if(CONVERT(int, @mfr_id) = 5) 

應該做的伎倆希望。詳情請參閱http://msdn.microsoft.com/en-us/library/ms187928.aspx。雖然實際上我認爲它應該被隱式轉換。 @mfr_id的價值是什麼?它應該在錯誤信息中告訴你我想的。

+0

@mfr_id是varchar,但它的存儲1 2,3,4 ...... – Anilkumar 2010-05-07 16:00:06

+1

啊,在這種情況下,使表達式的另一端爲if(@mfr_id ='5')的字符串。我可以只檢查一下你是否需要平等,而不是嘗試進行「包含」類型檢查? – 2010-05-07 16:02:10

+0

如果@mfr_id的值不是數字,這將失敗,請嘗試:'declare @mfr_id varchar(5); set @ mfr_id ='A'; if(CONVERT(int,@mfr_id)= 5)PRINT'will get an錯誤!'' – 2010-05-07 17:08:02

0

本答案使用Oracle的PL/SQL語法和Oracle正則表達式例程之一編寫。我不知道T-SQL能夠很好地轉錄它,但我預計可以使用類似的功能:

FOR aRow IN 
    (WITH DATA AS (SELECT @mfg_id AS S FROM DUAL) 
    SELECT REGEXP_SUBSTR(S, '[^ ,]+', 1, LEVEL) AS NUM_STRING 
     FROM DATA 
     CONNECT BY LEVEL < LENGTH(S) - LENGTH(REGEXP_REPLACE(S, '[ ,]', ''))) 
LOOP 
    IF aRow.NUM_STRING = '5' THEN 
    NULL; -- do something appropriate here 
    END IF; 
END LOOP; 

分享和享受。

相關問題