1

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

...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”转换为数据类型 int 时转换失败。

我可以做些什么来达到我的目标并让 SQL 引擎保持安静?如果存在最佳解决方案,我可以考虑修改现有的 VB 代码。

编辑1:我不会使用链接帖子的那个丑陋的解决方案!

4

2 回答 2

3

使用表值参数发送多个值。

CREATE PROC foo
   @IDList SomeType READONLY
AS
...
    WHERE someParam IN (SELECT ID FROM @IDList )
...
GO
于 2013-05-31T15:00:50.917 回答
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, '.'))
于 2013-05-31T14:59:31.540 回答