Reporting services 如何创建具有唯一标识符的多选参数?

Reporting services 如何创建具有唯一标识符的多选参数?,reporting-services,parameters,uniqueidentifier,Reporting Services,Parameters,Uniqueidentifier,我正在开发一个SSRS 2008 R2 RDL文件。现在,我正在尝试添加一个报表参数,它应该是一个多选参数。以前我使用过multi-select参数,但它们以前一直是字符数据类型。因此,在我的主要数据集中,我的代码是: ;WITH Cte AS ( SELECT 1 as id, CAST('<M>' + REPLACE( (select @IncidentType), ',' , '</M><M>') + '

我正在开发一个SSRS 2008 R2 RDL文件。现在,我正在尝试添加一个报表参数,它应该是一个多选参数。以前我使用过multi-select参数,但它们以前一直是字符数据类型。因此,在我的主要数据集中,我的代码是:

;WITH Cte AS 
( 
    SELECT 
        1 as id, 
        CAST('<M>' + REPLACE( (select @IncidentType),  ',' , '</M><M>') + '</M>' AS XML) AS Names 
) 
SELECT 
    id, 
    Split.a.value('.', 'VARCHAR(MAX)') AS Names
INTO #incident_types     
FROM Cte 
CROSS APPLY Names.nodes('/M') Split(a)
如何通过传入多个唯一标识符来编写代码

我尝试了下面您发布的解决方案:

CAST(Split.a.value('.', 'VARCHAR(MAX)') AS UNIQUEIDENTIFIER) AS Names
但这给了我一个错误:

Msg 8169, Level 16, State 2, Line 62
Conversion failed when converting from a character string to uniqueidentifier.
在我的存储过程的顶部,我有:

declare
    @FacilityID varchar(MAX) = null,
    @ProgramID uniqueidentifier = null,
    @ServiceDateStart smalldatetime = null,
    @ServiceDateEnd smalldatetime = null,
    @IncidentType varchar(MAX) = null

SET @IncidentType = '864EA130-F36B-4958-B51F-EE9DBD35D804,671A8EB3-8298-40DB-BD66-93309904E463,ACA1EB55-3D66-467B-8388-CC42FCFB00F3
SET @FacilityID = '83B465B8-28DD-4F37-9F2D-A4D5E38EE7FB,3EC657F7-655F-43FB-8424-2A8914E7C725,B2064474-5C9B-4884-B1D7-4FCE1C804DF7'
但导致此错误的行是:

   AND (@IncidentType is NULL OR event_definition_rv.event_definition_id in (SELECT Names FROM #incident_types))
因为我可以毫无错误地运行这些行:

select * from #incident_types
select * from #facilities

尝试将未拆分的值强制转换为唯一标识符:

    ;WITH Cte AS 
( 
    SELECT 
        1 as id, 
        CAST('<M>' + REPLACE( (select @IncidentType),  ',' , '</M><M>') + '</M>' AS XML) AS Names 
) 
SELECT 
    id, 
    CAST(Split.a.value('.', 'VARCHAR(MAX)') AS UNIQUEIDENTIFIER) AS Names
INTO #incident_types
FROM Cte 
CROSS APPLY Names.nodes('/M') Split(a)
但导致此错误的行是:

   AND (@IncidentType is NULL OR event_definition_rv.event_definition_id in (SELECT Names FROM #incident_types))
由于@IncidentType是一个多值报告参数, 您不能在报表的数据集查询中使用@IncidentType为NULL,因为它会弄乱sql代码,并且变得不可预测

此外,多值参数不能包含null值,因此检查参数是否为null是无用的。 你可以用这样的方法:

 AND ('NULL_FLAG' IN (@IncidentType) OR event_definition_rv.event_definition_id IN (@IncidentType))
看看上面写着什么:

查询必须使用IN子句来指定参数。 注: 报表服务器将重写无法访问的数据源的查询 将参数作为数组处理。必须重写查询才能 产生预期的结果。当发生查询时,将触发查询重写 参数定义为多值,查询使用IN语句 来指定参数。如果生成的查询不包括 在语句中,请注意您绕过了报表服务器提供的支持多值参数的逻辑


保罗,你能再看一眼吗?你能展示你的全部代码吗?运行EXEC tempdb..sp_help“事件类型”显示事件类型表的类型为GUID。我在从incident_types子句中选择名称时没有遇到任何问题,因此我认为问题可能出在其他地方。谢谢,我一定是将IncidentType输入错误了,因为现在我的存储过程正在使用您的逻辑!谢谢
 AND ('NULL_FLAG' IN (@IncidentType) OR event_definition_rv.event_definition_id IN (@IncidentType))