Sql 将数据类型varchar转换为数字

Sql 将数据类型varchar转换为数字,sql,sql-server,tsql,Sql,Sql Server,Tsql,Msg 8114,16级,状态5,程序SPCETDETAILS,第88行 将数据类型varchar转换为数字时出错 我已经将这个@mfr_id转换为int类型,然后也得到了上面的错误 我在执行存储过程时出错 我得到的错误是: if(@mfr_id = 5) 最新答案 看来@mfr_id是一个varchar。为了避免语法问题,请使用OMG Ponies post中的答案 但是你也说它正在存储字符串12,3,4。。。。。。因此,从语义上讲,如果IF语句包含值“5”,您是否希望它为true 如果是这

Msg 8114,16级,状态5,程序SPCETDETAILS,第88行 将数据类型varchar转换为数字时出错

我已经将这个@mfr_id转换为int类型,然后也得到了上面的错误

我在执行存储过程时出错

我得到的错误是:

if(@mfr_id = 5)
最新答案

看来@mfr_id是一个varchar。为了避免语法问题,请使用OMG Ponies post中的答案

但是你也说它正在存储字符串12,3,4。。。。。。因此,从语义上讲,如果IF语句包含值“5”,您是否希望它为true

如果是这样,你可能需要这样的东西

set @mfr_id = REPLACE(@mfr_id, ' ','')
if ((@mfr_id LIKE '5,%') OR (@mfr_id LIKE '%,5,%') OR (@mfr_id LIKE '%,5'))
原始答案-过时

希望你能成功。有关详细信息,请参阅。虽然实际上我认为应该隐式转换。@mfr\u id的值是多少?我想它应该会在错误消息中告诉您这一点。

更新了答案

看来@mfr_id是一个varchar。为了避免语法问题,请使用OMG Ponies post中的答案

但是你也说它正在存储字符串12,3,4。。。。。。因此,从语义上讲,如果IF语句包含值“5”,您是否希望它为true

如果是这样,你可能需要这样的东西

set @mfr_id = REPLACE(@mfr_id, ' ','')
if ((@mfr_id LIKE '5,%') OR (@mfr_id LIKE '%,5,%') OR (@mfr_id LIKE '%,5'))
原始答案-过时

希望你能成功。有关详细信息,请参阅。虽然实际上我认为应该隐式转换。@mfr\u id的值是多少?我认为它应该在错误消息中告诉您这一点。

使用:

if(@mfr_id = '5')
值比较必须是相同的数据类型,或者必须进行隐式数据类型转换。显式转换(使用时)是维护的理想选择,因为操作是显而易见的

根据您的需要,该功能可能会有所帮助。请小心为[n]varchar变量定义长度。

使用:

if(@mfr_id = '5')
值比较必须是相同的数据类型,或者必须进行隐式数据类型转换。显式转换(使用时)是维护的理想选择,因为操作是显而易见的


根据您的需要,该功能可能会有所帮助。请小心定义[n]varchar变量的长度。

此答案使用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;

共享和享受。

此答案使用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;

分享和享受。

Ah在这种情况下,请将表达式的另一面设置为字符串if@mfr_id = '5'. 我可以检查您是否需要相等,并且您没有尝试执行包含类型检查吗?如果@mfr\u id的值不是数字,这将失败,请尝试:declare@mfr\u id varchar5;设置@mfr_id='A';ifCONVERTint,@mfr_id=5 PRINT'将得到一个错误是的,在更新我的答案以反映评论之前,我一直在等待OP回复。我现在就做。啊,在这种情况下,让表达式的另一边是一个带if@mfr_id = '5'. 我可以检查您是否需要相等,并且您没有尝试执行包含类型检查吗?如果@mfr\u id的值不是数字,这将失败,请尝试:declare@mfr\u id varchar5;设置@mfr_id='A';ifCONVERTint,@mfr_id=5 PRINT'将得到一个错误是的,在更新我的答案以反映评论之前,我一直在等待OP回复。我现在就做。@mfr\u id变量声明为什么?@OMG Ponies@mfr\u id是varchar,但它存储的是12,3,4。从注释到我的答案。@mfr\u id变量声明为什么?@OMG Ponies@mfr\u id是varchar,但它存储的是12,3,4。从评论到我的回答。