【问题标题】:Conversion failed when converting the varchar value '1,2' to data type int将 varchar 值“1,2”转换为数据类型 int 时转换失败
【发布时间】:2018-09-11 10:19:40
【问题描述】:

当我在 sql server 存储过程中传递多个 id 时,它会抛出类似这样的错误==> 将 varchar 值“1,2”转换为数据类型 int 时转换失败。 这是sql查询 ===>SELECT * FROM SomeTable WHERE colName in(@Ids)

【问题讨论】:

    标签: stored-procedures


    【解决方案1】:

    如果您的存储过程参数需要varchar(n),请查看T-SQL split string 接受的答案,以从varchar 中拆分值。

    然后您可以在存储过程中应用该函数,您可以简单地将查询更改为如下内容:

    alter procedure your_stored_procedure @ids varchar(50) as begin select * from some_table where colName in (splitstring(@ids)) end go

    但是,如果您的存储过程接受int 作为参数,请将其更改为varchar 或任何数据类型。您的存储过程将不起作用,因为 int 只接受单个整数值。

    【讨论】:

      【解决方案2】:

      您必须先将字符串拆分为行。

      为此,您可以使用我的 sql Splitext 函数

      这里是安装脚本

      DROP FUNCTION IF EXISTS [dbo].[SplitText]
      GO
      SET ANSI_NULLS ON
      GO
      SET QUOTED_IDENTIFIER ON
      GO
      IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SplitText]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
      BEGIN
      execute dbo.sp_executesql @statement = N'CREATE FUNCTION [dbo].[SplitText]
      ( @TextForSplit varchar(1000)
      , @SplitWith    varchar(5) = '',''
      )       
      RETURNS  @DataSource TABLE 
      (
          ID  TINYINT identity,
          [Value] VARCHAR(500) NOT NULL
      )
      AS
      BEGIN
              DECLARE @XML xml = N''<r><![CDATA['' + REPLACE(@TextForSplit, @SplitWith, '']]></r><r><![CDATA['') + '']]></r>''
              INSERT INTO @DataSource ([Value])
              SELECT RTRIM(LTRIM(T.c.value(''.'', ''NVARCHAR(128)'')))
              FROM @xml.nodes(''//r'') T(c)
      
              DELETE @DataSource WHERE [VALUE] = ''''
              RETURN    
      END 
      END
      GO
      

      这就是它的使用方法。

      SELECT * FROM SomeTAble WHERE colName in( select value from Splittext('1,2,3,4,5' , ','))
      

      【讨论】:

        猜你喜欢
        • 2011-12-01
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多