我有一个存储过程。在这个过程中,有一段看起来像
的代码...WHERE someParam IN (1,2)...
我应该抽象这一部分,因为应该考虑未定义的参数数量(不仅仅是1或2)。我从vb.net代码获取此参数列表作为cvs字符串(即“1,2”或“78,109”等)。实际上,我的情况将是这样的:
DECLARE @IdParam varchar(100)
SET @IdParam = '1,2'
...
...WHERE someParam IN (@IdParm)...
但是这段代码显然会产生错误:
将varchar值“1,2”转换为数据类型时转换失败 中间体
我可以做些什么来达到目标并让SQL引擎保持安静?如果存在最佳解决方案,我可以考虑修改prexisten VB代码。
编辑1:我不会使用链接帖子的丑陋解决方案!
答案 0 :(得分:3)
使用table valued parameter发送多个值。
CREATE PROC foo
@IDList SomeType READONLY
AS
...
WHERE someParam IN (SELECT ID FROM @IDList )
...
GO
答案 1 :(得分:2)
您可以创建一个函数将字符串转换为列表...
ALTER FUNCTION [dbo].[fn_MVParamToInt](@RepParam nvarchar(max), @Delim char(1)= ',')
RETURNS @VALUES TABLE (Param int)AS
BEGIN
DECLARE @chrind INT
DECLARE @Piece nvarchar(max)
SELECT @chrind = 1
WHILE @chrind > 0
BEGIN
SELECT @chrind = CHARINDEX(@Delim,@RepParam)
IF @chrind > 0
SELECT @Piece = LEFT(@RepParam,@chrind - 1)
ELSE
SELECT @Piece = @RepParam
IF ISNUMERIC(@Piece) = 1
INSERT @VALUES(Param) VALUES(CAST(@Piece AS int))
SELECT @RepParam = RIGHT(@RepParam,LEN(@RepParam) - @chrind)
IF LEN(@RepParam) = 0 BREAK
END
RETURN
END
然后你的查询会变成......
...WHERE mycolumn IN (SELECT Param FROM dbo.fn_MVParamToInt(yourstring, '.'))