SSRS -- 多值参数字符串操作

SSRS -- Multi-value parameter string manipulation

上下文: 我有一个带有多值参数的 SSRS 报告。该报表将多值参数传递给存储过程,存储过程将其分配给 nvarchar 类型的变量。此变量包含映射到数据库中实际存储为 int 数据类型的值的唯一 ID。

详情: 基本上我需要 a) 修改 ssrs 报告以允许多值输入(我已经完成了) b) split_string 将nvarchar变量转化为可消耗的int类型块 c) 使用这些部分处理查询 d) 重新构造字符串以根据用户要求以串联方式呈现查询结果

问题: 您能否协助找到最有效的方法来在我(尝试)在下面起草的过程中执行这些转换?

旁注: 虽然我发现了一些与处理 procs 中的多值 ssrs 参数相关的帖子 here, here and -- 它们不是适用于考虑到需要多轮转换,我的具体情况。

/*This is the parameter supplied by the SSRS report that needs to be split, just declared here for commentary purposes
DECLARE @p_catalog_id nvarchar(max);
SET @p_catalog_id = '163650,163651,163652,163653,163654,163655,163656,163657,310415';
*/

BEGIN 

WITH EPV_IDs
AS
    (
        SELECT h.CATALOG_ID,
               h.PARENT_Catalog_ID as 'Series Collection ID',
               c.catalog_template as Template,
               d.CATALOG_ID as 'EPV ID'
        FROM [RDW_DIV38].[dbo].[Catalog_LINK_Catalog] as h 
          inner join [RDW_DIV38].[dbo].[Catalog] as c on c.Catalog_ID = h.CATALOG_ID
          left join [RDW_DIV38].[dbo].[Catalog_LINK_Catalog] as d on d.PARENT_Catalog_ID = h.PARENT_Catalog_ID
          inner join [RDW_DIV38].[dbo].[Catalog] as f on f.catalog_id=H.PARENT_Catalog_ID
        WHERE c.catalog_template = 'Episode Version'
          and f.catalog_template='series Collection'
          and c.Catalog_STATUS not in ('Withdrawn', 'Cancelled')
          and f.Catalog_STATUS not in ('Withdrawn', 'Cancelled')
          and d.Catalog_ID = @p_catalog_id
    ), 
X
AS
    (
        SELECT  EPV_IDs.[Series Collection ID],
                EPV_IDs.[Template],
                EPV_IDs.[EPV ID],
                COUNT(EPV_IDs.[EPV ID])as 'All EPVs'
        FROM EPV_IDs
        GROUP BY EPV_IDs.[Series Collection ID], EPV_IDs.[Template], EPV_IDs.[EPV ID]
    ),
y
AS
    (
        SELECT X.[Series Collection ID], 
               X.[Template],
               case when COUNT(X.[EPV ID]) = X.[All EPVs] Then 'Yes' Else 'No' ENd as 'Full?',
               COUNT(X.[EPV ID]) as 'EPVs Found',
               X.[All EPVs],STRING_AGG(X.[EPV ID],',')as 'EPV IDs'
        FROM X
        GROUP BY X.[Series Collection ID] ,X.[Template],x.[All EPVs]
    ), 
A
AS
    (
        SELECT x.[EPV ID],
               y.[Series Collection ID],
               y.[Template],
               STRING_AGG(y.[Full?],'/')as [Full?],
               y.[EPVs Found],
               y.[All EPVs],
               y.[EPV IDs]
        FROM y
        inner join x on x.[Series Collection ID]=y.[Series Collection ID]
        GROUP BY x.[EPV ID], y.[Series Collection ID], y.[Template], y.[EPVs Found], y.[All EPVs], y.[EPV IDs]
    )
        SELECT DISTINCT a3.[Series Collection ID] as Series_Collection_ID,
                        a3.[Template],
                        a.[Full?] as [Full],
                        a3.[EPVs Found] as EPVs_Found,
                        a3.[All EPVs] as All_EPVs,
                        a3.[EPV IDs] as EPV_IDs
        FROM a
        left join a as a3 on  a3.[EPV ID]=a.[EPV ID]
        WHERE not exists (

                           SELECT 1
                           FROM a a2
                           WHERE a2.[EPV ID] =a.[EPV ID] and  a2.[Full?] = 'Yes'

                         )
        UNION
        SELECT a.[Series Collection ID] as Series_Collection_ID,
               a.[Template],
               a.[Full?] as [Full],
               a.[EPVs Found] as EPVs_Found,
               a.[All EPVs] as All_EPVs,
               a.[EPV IDs] as EPV_IDs
        FROM a
        WHERE a.[Full?]='Yes'

END

如果你的数据库是 2016 那么你可以只使用 string_split: 替换

and d.Catalog_ID = @p_catalog_id

and CAST(d.Catalog_ID as varchar(10)) IN (SELECT value FROM STRING_SPLIT(@p_catalog_id, ',')

否则我建议您使用 FOR XML PATH 方法 - 那里有很多例子 还有其他人: https://sqlperformance.com/2012/07/t-sql-queries/split-strings