使用变量将参数发送到IN子句

时间:2013-05-31 14:56:45

标签: sql sql-server tsql sql-server-2005

我有一个存储过程。在这个过程中,有一段看起来像

的代码
...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:我不会使用链接帖子的丑陋解决方案!

2 个答案:

答案 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, '.'))