存储过程中的多值参数在向其传递多个值时返回错误

问题描述 投票:0回答:2

我正在创建一个使用两个多值参数的存储过程:

@Class AS VARCHAR(5),
@Service AS VARCHAR(5)
(…)    
WHERE B.UTRCLS IN (@Class) AND B.UTSVC IN (@Service)

当两个参数只包含一个值时,该过程正常。但是,当其中一个或两个使用多个值时,它会抛出错误。

在报表生成器中,错误如下:

无法读取数据集DataSet1的下一个数据行(rsErrorReadingNextDataRow)

在SQL Server中,错误显示如下(截断长度):

无法执行查询“SELECT Col1009,Col1010,Col1008,Expr1003,Expr1004 FROM(SELECT Col1009,Tbl1001.UTCSNM Col1008,Col1010,SUM(Col1016)Expr1003,SUM(Col1014)Expr1004 FROM(...)

我不认为我在声明参数方面做错了。这是存储过程中多值参数的问题吗?

sql-server reportbuilder3.0 sql-server-2017
2个回答
0
投票

您需要使用动态查询:

SET @sqlCommand = 'SELECT * FROM yourTable B WHERE B.UTRCLS IN ( +' @Class + ')' +
                  ' AND B.UTSVC IN (' + @Service +' )'

EXECUTE sp_executesql @sqlCommand

0
投票

您对帖子的评论是正确的。参数对于存储过程调用的范围是单值的,而不是针对参数值集迭代。如果您想将许多值传递给这些参数,我认为您有2个选项。

第一种是扩展参数的字符长度,并使用分隔符来分割值。然后,您的存储过程代码需要解析这些值,并为每个值执行所需的操作。 STRING_SPLIT()函数可以帮助您。

第二个选项是定义类型表的用户数据类型,该类型反映了您需要在参数中传递的多值的数据结构。在存储过程调用中,您将定义此类型的变量,使用值填充它,然后将该变量传递给存储过程。请注意,这样做时必须将它们设置为READ ONLY。

链接到MSDN以创建用户类型:https://docs.microsoft.com/en-us/sql/t-sql/statements/create-type-transact-sql?view=sql-server-2017

© www.soinside.com 2019 - 2024. All rights reserved.