2015-06-03 125 views
2

我的报告名为@Animal('Cat','Dog','Mouse')的报告中有多值参数。SSRS报告:获取参数数据值并将其存储到数据集中的变量中

内部数据集我需要'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?

谢谢堆!

回答

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 
相关问题