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) 
) 

很容易理解。每封郵件可以有多個參數和多個收件人。

然後,我有一個通過消息類型獲取隊列中所有未決消息的存儲過程。

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

如果你把

SET FMTONLY OFF 

在您的存儲過程的頂部,SSRS跳過驗證,這樣就可以在查詢中使用臨時表。