【问题标题】:SSRS Report: get parameter data value and store it into variable in datasetSSRS Report:获取参数数据值并将其存储到数据集中的变量中
【发布时间】:2015-06-03 07:20:26
【问题描述】:

我的报告中有一个名为@Animal 的多值参数,它有 ('Cat', 'Dog', 'Mouse')。

在数据集中我需要获取'Cat'、Dog'、'Mouse'并将其存储到@AnimalName 表变量中。

“硬编码”方式是:

DECLARE @AnimalName TABLE (Name nvarchar (10))
INSERT INTO @AnimalName SELECT ('Cat');
INSERT INTO @AnimalName SELECT ('Dog');
INSERT INTO @AnimalName SELECT ('Mouse');

我知道我可以直接在我的数据集中使用@Animal,我这样做的原因是因为我正在尝试提高我的报告的性能。许多多值参数会使报表永远运行。

有人知道如何(语法)获取@Animal 数据值并将其存储到数据集中的表变量@AnimalName 中吗?

谢谢大家!

【问题讨论】:

    标签: sql reporting-services ssrs-2008 ssrs-2008-r2


    【解决方案1】:

    将逗号分隔的字符串传递到存储过程中,并在存储过程中使用表值函数将多值参数转换为表。

    CREATE PROC GetAllAnimals 
                          @AnimalList nvarchar(max)
    AS
    
    DECLARE @Animals TABLE (Animal nvarchar(10))
    INSERT INTO @Animals SELECT * FROM dbo.fnGetValueListFromMultiSelect(@AnimalList)
    

    然后使用@Animals 表在查询中进行内部联接

    下面声明的函数。

    对于整数(或 ID)值

    CREATE FUNCTION [dbo].[fnGetIdListFromMultiSelect](@String nvarchar(MAX))
    RETURNS @Results TABLE ([Id] int)
    AS
        BEGIN
        DECLARE @Delimiter CHAR(1) 
        DECLARE @INDEX INT
        DECLARE @SLICE nvarchar(4000)
    
        IF @String IS NULL RETURN   
        SET @Delimiter = ','
        SET @INDEX = 1  
    
        WHILE @INDEX !=0
            BEGIN 
             -- GET THE INDEX OF THE FIRST OCCURENCE OF THE SPLIT CHARACTER
             SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
             -- NOW PUSH EVERYTHING TO THE LEFT OF IT INTO THE SLICE VARIABLE
             IF @INDEX !=0
             BEGIN
              SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
              -- CHOP THE ITEM REMOVED OFF THE MAIN STRING
              SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
             END
             ELSE
              SELECT @SLICE = @STRING                   
                -- PUT THE ITEM INTO THE RESULTS SET
                INSERT INTO @Results([Id]) VALUES(CAST(@SLICE AS INT))          
             -- BREAK OUT IF WE ARE DONE
             IF LEN(@STRING) = 0 BREAK
        END
        RETURN
    END
    

    对于字符串值

    CREATE FUNCTION [dbo].[fnGetValueListFromMultiSelect](@String nvarchar(MAX))
    RETURNS @Results TABLE ([Item] nvarchar(128) Primary Key)
    AS
        BEGIN
        DECLARE @Delimiter CHAR(1) 
        DECLARE @INDEX INT
        DECLARE @SLICE nvarchar(4000)
    
        SET @Delimiter = ','
        SET @INDEX = 1
    
        WHILE @INDEX !=0
            BEGIN 
             -- GET THE INDEX OF THE FIRST OCCURENCE OF THE SPLIT CHARACTER
             SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
             -- NOW PUSH EVERYTHING TO THE LEFT OF IT INTO THE SLICE VARIABLE
             IF @INDEX !=0
             BEGIN
              SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
              -- CHOP THE ITEM REMOVED OFF THE MAIN STRING
              SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
             END
             ELSE
              SELECT @SLICE = @STRING
             -- PUT THE ITEM INTO THE RESULTS SET
             INSERT INTO @Results([Item]) VALUES(@SLICE)
    
             -- BREAK OUT IF WE ARE DONE
             IF LEN(@STRING) = 0 BREAK
        END
        RETURN
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-03
      • 2013-05-16
      • 2014-06-30
      • 2018-04-01
      • 1970-01-01
      • 2019-08-19
      • 2017-04-21
      • 2019-09-30
      相关资源
      最近更新 更多