0

SQL Server 2008 の一連のレポート ストアド プロシージャに複数のパラメーターを渡す問題の解決策を提供する必要があります。パラメーターはユーザー設定になり、ユーザーが複数の種類の値を選択したリストで構成される場合があります (例:数か月)。30 もの異なるパラメータが存在する可能性があり、それらの 60% には複数の選択が含まれる可能性があります。

これまでのところ、3つのオプションがあります。

  1. 設定されたインターフェイスを使用して、値を通常のパラメーターとして渡します。これは、コレクションを渡す必要があるため、すぐに失敗するようです (複数の月が良い例です)。

  2. パラメータを単一の XML フラグメントとして渡します。このメソッドは既にここで使用されていますが、同じタイプの複数の要素 (上記の月のように) に対応できるかどうかはわかりません。このコードでは、DynaFilter を使用して XML を解析しています。私はそれについて聞いたことがなく、インターネット上で参照を見つけることができません。コードを書いた開発者が明日戻ってくるので、その時に詳しい情報を入手できます。

  3. テーブル値パラメーターを使用してください - 私はこれらを調べ始めたばかりですが、有望に見え、優れたパフォーマンスを提供しているようです。

ASP.Net MVC フロント エンドで SQL Server 2008 を使用しています。必要に応じて 2012 年に移行することもできます。

私はこの問題に対処するための最善の方法についてさらに調査を開始し、今後も継続していきますが、今後の最善の方法や他に利用可能なオプションがあるかどうかについての意見をお待ちしております.

前もって感謝します。

4

1 に答える 1

0

テーブル値パラメーターを使用してこれを行う方法を次に示します。これらは SQL 2008 で導入されたため、このルートを選択する場合、そのバージョンはソリューションに適しています。このテスト シナリオでは、プライマリ テーブルと、プライマリを指す外部キーを持つ関連テーブルを作成しています。

まず、テーブルのデータ型を作成します。

CREATE TYPE primary_tbltype AS TABLE 
   (personkey int NOT NULL PRIMARY KEY,
    firstname varchar(30),
    lastname varchar(30))

CREATE TYPE related_tbltype AS TABLE 
   (fk_personkey int NOT NULL,
    accountnum varchar(30),
    accountbalance money)

ストアド プロシージャを作成します。

CREATE PROCEDURE MySproc
    @PrimaryTable primary_tbltype READONLY,
    @RelatedTable related_tbltype READONLY
AS
BEGIN
DECLARE @CurrentKey INT
DECLARE @FirstName VARCHAR(30)
DECLARE @LastName VARCHAR(30)
DECLARE @AccountTotal MONEY

DECLARE PersonCursor CURSOR LOCAL FAST_FORWARD FOR
    SELECT personkey, firstname, lastname FROM @PrimaryTable
OPEN PersonCursor
FETCH NEXT FROM PersonCursor INTO @CurrentKey, @FirstName, @LastName
WHILE @@FETCH_STATUS= 0 BEGIN

    SELECT @AccountTotal = SUM(accountbalance) FROM @RelatedTable 
        WHERE fk_personkey = @CurrentKey

    PRINT @FirstName + ' ' + @LastName + ' - account total: ' + CONVERT(VARCHAR(30), @AccountTotal)

    FETCH NEXT FROM PersonCursor INTO @CurrentKey, @FirstName, @LastName
END
END;

そして、これを試すためのテストデータを次に示します。

DECLARE @primaryTVP primary_tbltype
DECLARE @relatedTVP related_tbltype

INSERT INTO @primaryTVP values (1, 'John', 'Cleese')
INSERT INTO @primaryTVP values (2, 'Eric', 'Idle')
INSERT INTO @primaryTVP values (3, 'Graham', 'Chapman')

INSERT INTO @relatedTVP values (1, '29310918', 28934.33)
INSERT INTO @relatedTVP values (2, '123123', 3418.11)
INSERT INTO @relatedTVP values (2, '33333', 666.66)
INSERT INTO @relatedTVP values (3, '554433', 22.22)
INSERT INTO @relatedTVP values (3, '239482', 151515.15)


EXEC MySproc @primaryTVP, @relatedTVP;

TVP を使用する利点のいくつかはここで説明されており、セットベースの操作にも参加できます。

于 2013-10-07T22:02:40.607 に答える