1

마지막으로 동적 피벗을 수행하여 TO 및 모든 보고서 매개 변수를 다시 전달하는 다소 복잡한 메시지 큐 시스템이 있습니다. SSRS를 내 메일 메시지 형식 공급자 및 데이터 기반 구독으로 사용하여 전자 메일을 자동 배달합니다.동적 피벗 테이블을 반환 값으로 사용하는 SSRS 데이터 기반 구독

내 문제는 UI를 사용하여 데이터 기반 구독을 설정하면 SSRS가 오류로 이동하지 못하게한다는 것입니다.

데이터 세트를 생성 할 수 없습니다. 데이터 소스에 데이터 소스에 연결하는 동안 오류가 발생했거나 쿼리가 올바르지 않습니다. (rsCannotPrepareQuery)

다음은 내가하는 일에 대한 기본적인 개요입니다. 내 메시지 대기열 시스템에이 테이블이 있습니다.

CREATE TABLE MessageParameters 
(
    SequenceId    int     IDENTITY(1,1) NOT NULL, 
    MessageQueueId   int     NOT NULL, 
    ParameterName   varchar(50)   NOT NULL, 
    ParameterValue   varchar(300)  NOT NULL, 

    CONSTRAINT PK_MessageParameters PRIMARY KEY CLUSTERED(SequenceId) 
) 

CREATE TABLE MessageRecipients 
(
    SequenceId    int     IDENTITY(1,1) NOT NULL, 
    MessageQueueId   int     NOT NULL, 
    ProfileId    int     NOT NULL, 

    CONSTRAINT PK_MessageRecipients PRIMARY KEY CLUSTERED(SequenceId) 
) 

CREATE TABLE MessageTypes 
(
    Id      int     NOT NULL, 
    ReportName    varchar(50)   NOT NULL, 

    CONSTRAINT PK_MessageTypes PRIMARY KEY CLUSTERED(Id) 
) 

CREATE TABLE MessageStatus 
(
    Id      int     NOT NULL, 
    StatusName    varchar(50)   NOT NULL, 

    CONSTRAINT PK_MessageStatus PRIMARY KEY CLUSTERED(Id) 
) 

CREATE TABLE MessageQueue 
(
    SequenceId    int     IDENTITY(1,1) NOT NULL, 
    MessageType    int     NOT NULL, 
    [Status]    int     DEFAULT(0) NOT NULL, 
    Created     datetime   DEFAULT(GETDATE()) NOT NULL, 
    Modified    datetime   DEFAULT(GETDATE()) NOT NULL, 

    CONSTRAINT PK_MessageQueue PRIMARY KEY CLUSTERED(SequenceId) 
) 

상당히 이해하기 쉽습니다. 각 메시지는 둘 이상의 매개 변수와 둘 이상의 수신자를 가질 수 있습니다.

그런 다음 메시지 유형별 대기열에서 보류중인 모든 메시지를 가져 오는 sproc가 있습니다.

CREATE PROCEDURE GetPendingMessageRecipients 
    @MessageType  int 
AS 
BEGIN 


    SELECT 
     SequenceId 
    INTO 
     #Messages 
    FROM 
     MessageQueue 
    WHERE 
     MessageType = @MessageType 
    AND 
     [Status] = 0 

    --############################################################### 
    --############################################################### 

    DECLARE @ParameterList varchar(max) 
    DECLARE @To varchar(max) 

    SELECT 
     r.MessageQueueId, 
     ISNULL(@To, '') + p.EmailAddress + ',' AS [TO] 
    INTO 
     #Recipients 
    FROM 
     MessageRecipients r 
    JOIN 
     WebProfiles p 
    ON 
     r.ProfileId = p.Id 
    JOIN 
     #Messages m 
    ON 
     r.MessageQueueId = m.SequenceId 

    --remove the last comma 
    UPDATE 
     #Recipients 
    SET 
     [TO] = LEFT([TO], LEN([TO]) - 1) 

    --############################################################### 
    --############################################################### 

    SELECT 
     p.MessageQueueId, 
     p.ParameterName, 
     p.ParameterValue 
    INTO 
     #Params 
    FROM 
     MessageParameters p 
    JOIN 
     #Messages m 
    ON 
     p.MessageQueueId = m.SequenceId 

    INSERT INTO #Params 
    SELECT 
     MessageQueueId, 'TO', [TO] 
    FROM 
     #Recipients 

    --############################################################### 
    --############################################################### 

    SELECT @ParameterList = ISNULL(@ParameterList, '') + 
     '[' + ParameterName + '],' 
    FROM 
     #Params 
    GROUP BY 
     ParameterName 

    -- Remove last comma 
    SET @ParameterList = LEFT(@ParameterList, LEN(@ParameterList) - 1) 

    DECLARE @Query varchar(max) 
    SET @Query = 'SELECT * ' + 
     'FROM #Params ' + 
     'PIVOT (' + 
     ' max([ParameterValue]) ' + 
     ' for [ParameterName] ' + 
     ' in (' + @ParameterList + ') ' + 
     ') AS pvt' 

    EXEC (@Query) 


END 

경영 스튜디오 내부의 챔피언처럼 작동합니다. 나는 messageid,받는 사람을 쉼표로 구분 된 목록에 TO 필드로, 그리고 모든 보고서 매개 변수에 올바른 필드 이름을 지정합니다. 그러나 SSRS는받는 사람 데이터 원본으로 입력하려고 할 때 한 번 좋아하지 않습니다. 당신이 당신의 저장 프로 시저의 상단에

SET FMTONLY OFF 

를 넣어 경우 쿼리에서 임시 테이블을 사용할 수 있도록

답변

1

는 SSRS 유효성 검사를 건너 뜁니다.

관련 문제