将varchar值'1,2'转换为数据类型int时转换失败

时间:2018-09-11 10:19:41

标签: stored-procedures

当我在sql server存储过程中传递多个id时,它将引发如下错误==>将varchar值'1,2'转换为数据类型int时转换失败。 这是SQL查询 ===>选择*从某处colName输入(@Ids)

2 个答案:

答案 0 :(得分:0)

如果您的存储过程参数期望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仅接受单个整数值。

答案 1 :(得分:0)

您必须先将字符串分成几行。

为此,您可以使用我的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' , ','))