2010-05-07 47 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; 

分享和享受。

相关问题