我正在开发SSRS 2008 R2 RDL文件。现在,我正在尝试添加一个应该是多选的报表参数。以前我使用过多选参数,但它们之前一直是CHARACTER数据类型。所以在我的主数据集中,我的代码是:
;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)
(在我的RDL文件中,此IncidentType报告参数允许多选)
但是现在IncidentType是一个UNIQUEIDENTIFIER数据类型。我已经尝试过SSRS JOIN函数,但是当我运行它时,这仍然在SSRS中给出了同样的错误:
An error has occurred during report processing. (rsProcessingAborted)
Query execution failed for dataset 'Incidents'. (rsErrorExecutingCommand)
Conversion failed when converting from a character string to uniqueidentifier.
如何通过传入多个uniqueidentifier进行编码?
我尝试了您发布的以下解决方案:
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.
在我的sproc顶部,我有:
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
答案 0 :(得分:1)
尝试将unsplit值转换为uniqueidentifier:
;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)
答案 1 :(得分:0)
但导致此错误的行是:
AND (@IncidentType is NULL OR event_definition_rv.event_definition_id in (SELECT Names FROM #incident_types))
由于@IncidentType是多值报表参数,
您无法在报告的数据集查询中使用@IncidentType Is NULL
,因为它会破坏sql代码并且变得无法预测。
此外&#34; 多值参数不能包含空值&#34;所以检查参数是否为空是没用的。 你也许可以使用这样的possible workaround:
AND ('NULL_FLAG' IN (@IncidentType) OR event_definition_rv.event_definition_id IN (@IncidentType))
请参阅docs.microsoft.com其中的内容:
- 查询必须使用IN子句指定参数。
注意:
报表服务器重写查询,查找不能的数据源 过程参数作为数组。重写查询是必要的 产生预期的结果。 a时会触发查询重写 参数定义为多值,查询使用IN语句 指定参数。如果您构建不包含的查询 在IN声明中,请注意,您正在规避报表服务器提供的逻辑以支持多值参数。