Sql server ssrs多值参数存储过程

Sql server ssrs多值参数存储过程,sql-server,reporting-services,parameter-passing,Sql Server,Reporting Services,Parameter Passing,我在SSRS(2008)中创建了一个报告,该报告的数据来自MS SQL中的存储过程 我希望有一个多值参数(执行了一百万次,但没有使用SP) 我基于一个查询创建了参数,勾选了allow multiple values并修改了SP以使用IN语句(so IN(@Param)) 如果SQL Server探查器显示此消息已被传递,则它将不起作用 @RC=N'1,2' 如果我选择一个值,它会工作(返回一个值) 我看到过关于拆分加入的帖子,我尝试过所有这些都没有用 任何想法(当然很简单!!)理想情况下我也希

我在SSRS(2008)中创建了一个报告,该报告的数据来自MS SQL中的存储过程

我希望有一个多值参数(执行了一百万次,但没有使用SP)

我基于一个查询创建了参数,勾选了allow multiple values并修改了SP以使用IN语句(so IN(@Param))

如果SQL Server探查器显示此消息已被传递,则它将不起作用

@RC=N'1,2'
如果我选择一个值,它会工作(返回一个值)

我看到过关于拆分加入的帖子,我尝试过所有这些都没有用

任何想法(当然很简单!!)理想情况下我也希望能够返回NULL(或者这要求太高了


谢谢大家

在数据库中创建此功能:

USE [YourDatabase]
GO

/****** Object:  UserDefinedFunction [dbo].[SplitListToTable]    Script Date: 5/21/2018 8:13:29 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO


--==========================================================
-- Author: Gugg
-- Created: 2015-10-06
-- Description: Converts a delimited string into a table of values.  Based heavily on code from this url:
--              https://social.msdn.microsoft.com/Forums/sqlserver/en-US/0ead7ceb-3fdd-4625-aa82-1d4195f984b1/passing-multivalue-parameter-in-stored-procedure-ssrs
-- Modification History:
--===========================================================

CREATE FUNCTION [dbo].[SplitListToTable]
    (
      @List NVARCHAR(2000) ,
      @SplitOn NVARCHAR(5)
    )
RETURNS @RtnValue TABLE
    (
      Id INT IDENTITY(1, 1) ,
      Value NVARCHAR(100)
    )
AS
    BEGIN
        WHILE ( CHARINDEX(@SplitOn, @List) > 0 )
            BEGIN 
                INSERT  INTO @RtnValue
                        ( Value
                        )
                        SELECT  Value = LTRIM(RTRIM(SUBSTRING(@List, 1, CHARINDEX(@SplitOn, @List) - 1))); 
                SET @List = SUBSTRING(@List, CHARINDEX(@SplitOn, @List) + LEN(@SplitOn), LEN(@List));
            END; 

        INSERT  INTO @RtnValue
                ( Value )
                SELECT  Value = LTRIM(RTRIM(@List));
        RETURN;
    END;



GO
然后可以像这样解析参数:

SELECT *
FROM YourDatabase.dbo.YourTable
WHERE YourColumn IN(SELECT value FROM dbo.SplitListToTable(@YourParameter, ','))

我感觉到了您的痛苦,我们在将SSR与SP一起使用时也遇到了同样的问题。您确实需要分割传递给存储过程的值

在您的存储过程中,SQL是预期的

 Alias.Field1 IN (@RC) 
这可归结为

Alias.Field1 IN ('Value1','Value2,'Value3')
但是,SSRS将把参数值作为一个长字符串传递(我无法理解为什么MS会这样做),最终会变成这样

Alias.Field1 IN ('Value1,Value2,Value3')
正如您正确指出的那样,您对数据的控制为零。因此您需要使用Split Strings函数。Aaron Bertrand在这篇文章上发表了一篇很好的博文,根据数据库的大小为您提供了每种方法的优缺点。我们使用Split Strings CTE,因为它为我们大多数数据库的大小提供了最佳性能。

这里是函数

CREATE FUNCTION [dbo].[fn_SplitStringsCTE]
(
   @List       NVARCHAR(MAX),
   @Delimiter  NVARCHAR(255)
)
RETURNS @Items TABLE (Item NVARCHAR(4000))
WITH SCHEMABINDING
AS
BEGIN
   DECLARE @ll INT = LEN(@List) + 1, @ld INT = LEN(@Delimiter);

   WITH a AS
   (
       SELECT
           [start] = 1,
           [end]   = COALESCE(NULLIF(CHARINDEX(@Delimiter, 
                       @List, 1), 0), @ll),
           [value] = SUBSTRING(@List, 1, 
                     COALESCE(NULLIF(CHARINDEX(@Delimiter, 
                       @List, 1), 0), @ll) - 1)
       UNION ALL
       SELECT
           [start] = CONVERT(INT, [end]) + @ld,
           [end]   = COALESCE(NULLIF(CHARINDEX(@Delimiter, 
                       @List, [end] + @ld), 0), @ll),
           [value] = SUBSTRING(@List, [end] + @ld, 
                     COALESCE(NULLIF(CHARINDEX(@Delimiter, 
                       @List, [end] + @ld), 0), @ll)-[end]-@ld)
       FROM a
       WHERE [end] < @ll
   )
   INSERT @Items SELECT [value]
   FROM a
   WHERE LEN([value]) > 0
   OPTION (MAXRECURSION 0);

   RETURN;
END
GO
至于将空值传递给存储过程,这也是我们想要做的事情,但我们决定使用以下方法,然后向SSRS参数添加一个传递“所有值”的值,当我们想要返回该参数的所有值时,这对我们来说是一个很好的总括,但是如果数据集中有空值,它们也需要待处理

AND (@RC = 'All Values' OR Alias.Field1 IN (SELECT Item FROM [dbo].[fn_SplitStringsCTE](@RC,',')))

只是想进一步了解一下,您正在尝试将多个
逗号分隔值作为
参数之一传递给
存储过程
,该过程不起作用?@abhishek SSRS以预定义格式传递参数,我似乎无法控制该格式(除了更改数据类型)如果我选择一些,可以发送@RC=N'1,2,3,4,5,6,7,8,9'(我更喜欢@RC='1','2','3','4',但这似乎无法完成。查看表值参数。查看此链接-您是个天才,这是第一次工作。简单易懂,易于添加到我的项目中。非常感谢您的回复(和同情哈)我永远也不知道为什么会这样。上面的Daves解决方案在我第一次尝试时对我起了作用。但我非常感谢你的时间和帮助。我知道有几篇关于这方面的文章,但我就是找不到在我的项目中起作用的解决方案。干杯,伙计
AND (@RC = 'All Values' OR Alias.Field1 IN (SELECT Item FROM [dbo].[fn_SplitStringsCTE](@RC,',')))