【发布时间】:2018-09-11 10:19:40
【问题描述】:
当我在 sql server 存储过程中传递多个 id 时,它会抛出类似这样的错误==> 将 varchar 值“1,2”转换为数据类型 int 时转换失败。 这是sql查询 ===>SELECT * FROM SomeTable WHERE colName in(@Ids)
【问题讨论】:
当我在 sql server 存储过程中传递多个 id 时,它会抛出类似这样的错误==> 将 varchar 值“1,2”转换为数据类型 int 时转换失败。 这是sql查询 ===>SELECT * FROM SomeTable WHERE colName in(@Ids)
【问题讨论】:
如果您的存储过程参数需要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 只接受单个整数值。
【讨论】:
您必须先将字符串拆分为行。
为此,您可以使用我的 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' , ','))
【讨论】: