Подписка на основе данных SSRS с динамической сводной таблицей в качестве возвращаемого значения - PullRequest
1 голос
/ 17 декабря 2010

У меня довольно сложная система очереди сообщений, в которой в конце я делаю динамический разворот, чтобы передать обратно TO, а также все параметры отчета. Я использую SSRS в качестве поставщика форматов почтовых сообщений и управляемых данными подписок для автоматической доставки электронной почты.

Моя проблема в том, что когда я использую пользовательский интерфейс для настройки подписки, управляемой данными, 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 не нравится, когда я пытаюсь ввести его в качестве источника данных получателей.

1 Ответ

1 голос
/ 17 декабря 2010

Если поставить

SET FMTONLY OFF

в верхней части хранимой процедуры SSRS пропускает проверку, чтобы вы могли использовать временные таблицы в своем запросе.

...