消息8114,级别16,状态5,过程spGetDetails,线88
误差变换数据类型为varchar到数字。转换数据类型为varchar到数字
我已经将此@mfr_id
转换为int类型,然后也收到上述错误。
我在执行存储过程时出错。
其中我得到错误的路线是:
if(@mfr_id = 5)
消息8114,级别16,状态5,过程spGetDetails,线88
误差变换数据类型为varchar到数字。转换数据类型为varchar到数字
我已经将此@mfr_id
转换为int类型,然后也收到上述错误。
我在执行存储过程时出错。
其中我得到错误的路线是:
if(@mfr_id = 5)
使用:
if(@mfr_id = '5')
值比较必须是相同的数据类型,或必须有隐式的数据类型转换。显式转换 - 当您使用CAST/CONVERT时 - 是维护的理想选择,因为操作很明显。
根据您的需要,ISNUMERIC功能可能会有所帮助。并且要小心地为你的[n] varchar变量定义一个长度。
更新答案
如此看来,@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的价值是什么?它应该在错误信息中告诉你我想的。
@mfr_id是varchar,但它的存储1 2,3,4 ...... – Anilkumar 2010-05-07 16:00:06
啊,在这种情况下,使表达式的另一端为if(@mfr_id ='5')的字符串。我可以只检查一下你是否需要平等,而不是尝试进行“包含”类型检查? – 2010-05-07 16:02:10
如果@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
本答案使用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;
分享和享受。
什么是@ mfr_id变量声明为? – 2010-05-07 16:27:08
@OMG Ponies“@mfr_id是varchar,但其存储1 2,3,4”。从评论到我的答案。 – 2010-05-07 16:28:35