如何在SSRS中使用多值参数

时间:2013-03-05 22:37:32

标签: sql reporting-services reportingservices-2005 multivalue

我有一张桌子。 1有1个多值参数列出所有称为PROPERTIES的属性。我希望表一次显示每行1个属性。

该表大约有20列,引用了不同的数据集。

引用该属性的所有数据集都包含:WHERE RMPROPID IN (@PROPERTIES),数据集的@PROPERTIES值为:=JOIN(Parameters!PROPERTIES.Value,",")(这将创建所选属性列表)

该表有一行,引用不同的数据集。表格数据集为SelectedProperties,行上的分组为=Fields!RMPROPID.Value

SelectedProperties数据集如下所示:

SELECT
   RMPROPID,
   propname
FROM
   RMPROP
WHERE
   RMPROPID IN (@PROPERTIES)

每当我选择多个属性时,它都不起作用。什么都没有归还。有没有我缺少的技巧?我想要一行引用一行属性。

3 个答案:

答案 0 :(得分:2)

问题是您在将参数传递给查询时重新确定参数:

你不应该有这个部分: =JOIN(Parameters!PROPERTIES.Value,",")创建所选值的列表。它会创建一个单个值,该值是一个组合所有选定值的字符串。

仅用=Parameters!PROPERTIES.Value替换上面的位。 SSRS会小心地将多个值放入SQL查询中。

答案 1 :(得分:0)

您应该能够将索引放在最后:

参数<参数名称>。价值(0)

您可以根据行返回或类似的行进行索引。

此处有更多信息:http://msdn.microsoft.com/en-us/library/aa337292(v=sql.90).aspx

答案 2 :(得分:0)

非高效但有效的方法是使用varchar(MAX)并以逗号分隔的方式获取UID。
然后你可以对它做一个喜欢:

CREATE FUNCTION [dbo].[tfu_RPT_SEL_Gebaeude]
( 
     --@in_mandant varchar(3) 
    --,@in_sprache varchar(2) 
    --,@in_groups varchar(8000) 
    --,@in_stichtag varchar(50) 
     @Standortkategorie varchar(MAX) 
    ,@Standort varchar(MAX) 
) 
    RETURNS table 
AS 
RETURN 
( 
    SELECT '00000000-0000-0000-0000-000000000001' AS RPT_FID_SK_UID, '00000000-0000-0000-0000-000000000000' AS RPT_FID_SO_UID, '00000000-0000-0000-0000-000000000000' AS RPT_UID, 'Ohne' AS RPT_Name, 999999999 AS RPT_Sort 

    UNION 

    SELECT DISTINCT 
         ISNULL(T_AP_Gebaeude.GB_SK_UID, '00000000-0000-0000-0000-000000000000') AS RPT_FID_SK_UID 
        ,T_AP_Gebaeude.GB_SO_UID AS RPT_FID_SO_UID 
        ,T_AP_Gebaeude.GB_UID AS RPT_UID 
        --,T_AP_Gebaeude.GB_MDT_ID AS RPT_MDT_ID 
        --,ISNULL(GB_Nr, '') + ' - ' + ISNULL(GB_Bezeichnung, '') AS RPT_Name 
        ,T_AP_Gebaeude.GB_Bezeichnung AS RPT_Name 

        --,T_AP_Gebaeude.GB_Bezeichnung AS RPT_Sort 
        ,ROW_NUMBER() OVER (ORDER BY T_AP_Gebaeude.GB_Bezeichnung ASC) AS RPT_Sort 
    FROM T_AP_Gebaeude 

    WHERE (1=1) 
    -- AND (T_AP_Standort.SO_MDT_ID = @in_mandant) 
    AND (T_AP_Gebaeude.GB_Status = 1) 
    AND (T_AP_Gebaeude.GB_DatumBis >= CONVERT(char(8), { fn NOW() }, 112)) 
    AND (T_AP_Gebaeude.GB_DatumVon <= { fn NOW() }) 

    --AND ( ISNULL(T_AP_Gebaeude.GB_SK_UID, '00000000-0000-0000-0000-000000000000') IN (@Standortkategorie) ) 
    AND ',' + @Standortkategorie + ',' LIKE '%,' + ISNULL(CAST(T_AP_Gebaeude.GB_SK_UID AS varchar(36)), '00000000-0000-0000-0000-000000000000') + ',%'

    -- AND ( ISNULL(T_AP_Gebaeude.GB_SO_UID, '00000000-0000-0000-0000-000000000000') IN (@Standort) ) 
    AND ',' + @Standort + ',' LIKE '%,' + ISNULL(CAST(T_AP_Gebaeude.GB_SO_UID AS varchar(36)), '00000000-0000-0000-0000-000000000000') + ',%'


    /*
    AND 
    ( 
        ( @in_groups = '0000') 
        OR 
        ( 
            SELECT 
                ISNULL(SUM(CAST(SOR_IsRead AS int)), 0) AS SOR_IsRead 
            FROM T_SYS_Standortrechte 
            WHERE (1=1) 
            AND T_SYS_Standortrechte.SOR_SO_UID = T_AP_Standort.SO_UID 
            --AND SOR_SO_UID = '274751EB-AED4-4E4C-B6D1-57C4FDBC8925' 

            AND @in_groups LIKE '%,' + CAST(T_SYS_Standortrechte.SOR_GRANTEE_ID AS varchar(36)) + ',%' 
        ) > 0 
    ) 

    AND 
    ( 
        ( @in_groups = '0000') 
        OR 
        ( 
            SELECT 
                ISNULL(SUM(CAST(GBR_IsRead AS int)), 0) AS GBR_IsRead 
            FROM T_SYS_Gebaeuderechte 
            WHERE (1=1) 
            AND T_SYS_Gebaeuderechte.GBR_GB_UID = T_AP_Gebaeude.GB_UID 
            --AND GBR_GB_UID = '274751EB-AED4-4E4C-B6D1-57C4FDBC8925' 

            AND @in_groups LIKE '%,' + CAST(T_SYS_Gebaeuderechte.GBR_GRANTEE_ID AS varchar(36)) + ',%' 
        ) > 0 
    ) 
    */

)


GO