1

我有 1 张桌子。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)

每当我选择多个属性时,它都不起作用。什么都没有返回。有没有我错过的技巧?我希望 1 行一次引用一个属性。

4

3 回答 3

2

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

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

将上面的位替换为=Parameters!PROPERTIES.Value. SSRS 将适当地处理或将多个值放入 SQL 查询中。

于 2013-03-06T15:30:08.367 回答
0

一种性能不佳但可行的方法是使用 varchar(MAX) 并以逗号分隔的方式获取 UID。
然后你可以对它做一个 LIKE :

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
于 2014-02-24T10:04:24.307 回答
0

您应该能够将索引放在末尾,如下所示:

参数!<ParameterName>.Value(0)

您可以根据您的行回报或类似的东西做一个索引。

更多信息在这里:http: //msdn.microsoft.com/en-us/library/aa337292 (v=sql.90).aspx

于 2013-03-05T23:52:58.170 回答