将数据类型varchar转换为数字

时间:2010-05-07 15:53:00

标签: sql sql-server tsql

  

Msg 8114,Level 16,State 5,Procedure spGetDetails,Line 88
  将数据类型varchar转换为数字时出错。

我已将此@mfr_id转换为int类型,然后也出现上述错误。

我在执行存储过程时遇到错误。

我收到错误的行是:

if(@mfr_id = 5)

3 个答案:

答案 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;

分享并享受。