Msg 8114,Level 16,State 5,Procedure spGetDetails,Line 88
将数据类型varchar转换为数字时出错。
我已将此@mfr_id
转换为int类型,然后也出现上述错误。
我在执行存储过程时遇到错误。
我收到错误的行是:
if(@mfr_id = 5)
答案 0 :(得分:2)
使用:
if(@mfr_id = '5')
值比较必须是相同的数据类型,或者必须进行隐式数据类型转换。显式转换 - 即使用CAST/CONVERT时 - 非常适合维护,因为操作很明显。
根据您的需要,ISNUMERIC功能可能有所帮助。并且要小心为[n] varchar变量定义长度。
答案 1 :(得分:1)
更新回答
所以似乎@mfr_id是一个varchar。为避免语法问题,请使用OMG Ponies帖子中的答案。
但你也说它存储了字符串“1 2,3,4 ......”。从语义上讲,如果IF语句包含值'5',您是否希望IF语句为真?
如果是这样,你可能需要这样的东西
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的价值是多少?它应该在我认为的错误消息中告诉你。
答案 2 :(得分: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;
分享并享受。