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は受信者のデータソースとして入力しようとすると、1ビットが好きではありません。

答えて

1

あなたのストアドプロシージャの先頭に

SET FMTONLY OFF 

を置く場合は、クエリで一時テーブルを使用できるように、SSRSは、検証をスキップします。

関連する問題