Sql server SSRS——多值参数字符串操作
上下文: 我有一份带有多值参数的SSRS报告。报表将多值参数传递给存储过程,存储过程将其分配给nvarchar类型的变量。此变量包含映射到数据库中实际存储为int数据类型的值的唯一ID 详细信息: 基本上我需要 a)修改ssrs报告以允许多值输入(我已经这样做了) b)将nvarchar变量拆分为可消耗的int类型片段 c)使用这些片段处理查询 d)根据用户需求重新构造字符串,以串联方式显示查询结果 问题: 你能帮我找到最有效的方法来执行我在下面起草的程序中的这些转换吗 旁注:虽然我发现了一些关于在procs中处理多值ssrs参数的帖子,但是——鉴于需要进行多轮转换,它们不是适用于我的特定场景的修复Sql server SSRS——多值参数字符串操作,sql-server,string,tsql,reporting-services,ssrs-2008,Sql Server,String,Tsql,Reporting Services,Ssrs 2008,上下文: 我有一份带有多值参数的SSRS报告。报表将多值参数传递给存储过程,存储过程将其分配给nvarchar类型的变量。此变量包含映射到数据库中实际存储为int数据类型的值的唯一ID 详细信息: 基本上我需要 a)修改ssrs报告以允许多值输入(我已经这样做了) b)将nvarchar变量拆分为可消耗的int类型片段 c)使用这些片段处理查询 d)根据用户需求重新构造字符串,以串联方式显示查询结果 问题: 你能帮我找到最有效的方法来执行我在下面起草的程序中的这些转换吗 旁注:虽然我发现了一些关
/*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: 替换 与 否则,我建议您使用FORXML路径方法——有很多egs &其他也包括:
谢谢@fandango68,但我不是在asp.net应用程序中传递网页文本。我还将多个参数传递到存储过程中,每个参数都有自己的值。你的博客提到这不是一个解决方案。因为我不能信任用户输入的自由文本,所以我不支持XML路径是最好的选择。不过我会试试你的其他建议,谢谢。
and d.Catalog_ID = @p_catalog_id
and CAST(d.Catalog_ID as varchar(10)) IN (SELECT value FROM STRING_SPLIT(@p_catalog_id, ',')