마지막으로 동적 피벗을 수행하여 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
를 넣어 경우 쿼리에서 임시 테이블을 사용할 수 있도록