2016-06-22 13 views
0

SSRSレポートに入力するための動的パラメータストアドプロシージャを作成しようとしています。私は多くのウェブサイトを閲覧した後、エンドユーザーがどのパラメータを使用するかをカスタム選択できるようにする方法を模索してきました。このプロセスでは、Endパラメータが1つの範囲で使用されていない場合、エンドユーザーはStartフィールドに入力された値のみに関心があるとみなされます。動的パラメータストアドプロシージャを書き込もうとしています

これまで私がこれまで持っていたことは次のとおりです。なぜ私はレポートを実行しようとするとSSRSをロックするのですか?

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[BrowseCODA] 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @DocList TABLE ([DocumentID] varchar(32)) 

    DECLARE @GLAccountStart int = NULL 
    DECLARE @GLAccountEnd int = NULL 
    DECLARE @CustomerID int = NULL 
    DECLARE @VendorID int = NULL 
    DECLARE @StoreID nvarchar(2) = NULL 
    DECLARE @DocDateStart date = NULL 
    DECLARE @DocDateEnd date = NULL 
    DECLARE @InputDateStart date = NULL 
    DECLARE @InputDateEnd date = NULL 
    DECLARE @AcctPeriodStart int = NULL 
    DECLARE @AcctPeriodEnd int = NULL 
    DECLARE @AcctYearStart int = NULL 
    DECLARE @AcctYearEnd int = NULL 
    DECLARE @PaymentID int = NULL 
    DECLARE @ExtRef1 nvarchar(30) = NULL 
    DECLARE @ExtRef2 nvarchar(30) = NULL 
    DECLARE @ExtRef3 nvarchar(30) = NULL 
    DECLARE @ExtRef4 nvarchar(30) = NULL 
    DECLARE @ExtRef5 nvarchar(30) = NULL 
    DECLARE @ExtRef6 nvarchar(30) = NULL 

    INSERT INTO @DocList([DocumentID]) 
     SELECT 
      company + '-' + FullDocNumber 
     FROM 
      [DataWarehouse].[dbo].[VDocDetails] 
     WHERE 
      ([GLAccount] >= @GLAccountStart OR @GLAccountStart IS NULL) 
      AND ((@GLAccountEnd IS NULL AND @GLAccountStart IS NOT NULL 
       AND [GLAccount][email protected]) 
       OR (@GLAccountEnd IS NOT NULL AND [GLAccount] <= @GLAccountEnd) 
       OR (@GLAccountEnd IS NULL)) 
      AND ([CustomerNumber] = @CustomerID OR @CustomerID IS NULL) 
      AND ([Vendor] = @VendorID OR @VendorID IS NULL) 
      AND ([Store] LIKE @StoreID+'%' OR @StoreID IS NULL) 
      AND ([Doc_Date] >= @DocDateStart OR @DocDateStart IS NULL) 
      AND ((@DocDateEnd IS NULL AND @DocDateStart IS NOT NULL 
       AND [Doc_Date] = @DocDateStart) 
       OR (@DocDateEnd IS NOT NULL AND [Doc_Date] <= @DocDateEnd) 
       OR (@DocDateEnd IS NULL)) 
      AND ([Input_Date] >= @InputDateStart OR @InputDateStart IS NULL) 
      AND ((@InputDateEnd IS NULL AND @InputDateStart IS NOT NULL 
       AND [Input_Date] = @InputDateStart) 
       OR (@InputDateEnd IS NOT NULL AND [Input_Date] <= @InputDateEnd) 
       OR (@InputDateEnd IS NULL)) 
      AND ([period] >= @AcctPeriodStart OR @AcctPeriodStart IS NULL) 
      AND ((@AcctPeriodEnd IS NULL AND @AcctPeriodStart IS NOT NULL 
       AND [period] = @AcctPeriodStart) 
       OR (@AcctPeriodEnd IS NOT NULL AND [period] <= @AcctPeriodEnd) 
       OR (@AcctPeriodEnd IS NULL)) 
      AND ([Year] >= @AcctYearStart OR @AcctYearStart IS NULL) 
      AND ((@AcctYearEnd IS NULL AND @AcctYearStart IS NOT NULL 
       AND [Year] = @AcctYearStart) 
       OR (@AcctYearEnd IS NOT NULL AND [Year] <= @AcctYearEnd) 
       OR (@AcctYearEnd IS NULL)) 
      AND ([PaymentID] = @PaymentID OR @PaymentID IS NULL) 
      AND ([Reference1] LIKE @ExtRef1+'%' OR @ExtRef1 IS NULL) 
      AND ([Reference2] LIKE @ExtRef2+'%' OR @ExtRef2 IS NULL) 
      AND ([Reference3] LIKE @ExtRef3+'%' OR @ExtRef3 IS NULL) 
      AND ([Reference4] LIKE @ExtRef4+'%' OR @ExtRef4 IS NULL) 
      AND ([Reference5] LIKE @ExtRef5+'%' OR @ExtRef5 IS NULL) 
      AND ([Reference6] LIKE @ExtRef6+'%' OR @ExtRef6 IS NULL) 

    SELECT 
     * 
    FROM 
     [DataWarehouse].[dbo].[VDocDetails] 
    WHERE 
     company + '-' + FullDocNumber IN (SELECT DocumentID FROM @DocList) 
END 
GO 
+0

ロックされているが、ストアドプロシージャのパラメータが、通常、CREATE/ALTERとAS BEGINの間に、DECLAREなしのカンマ区切りリストとして表示されます。 – SMM

+0

このストアドプロシージャはどのように使用されますか?つまり、変数の値をどのように設定しますか?プロシージャ・レベルで宣言されていないので、すべての変数をNULLとして扱います。 –

答えて

1

あなたの質問への回答:
あなたのストアドプロシージャに任意の変数を提供していないので、すべての内部変数がNULLのです。つまり、テーブルのすべてのレコードを抽出する必要があります。これはおそらく非常に巨大なテーブル+一時変数のメモリ問題の二重スキャンを引き起こします。 このような第一、あなたはおそらく、コードの何かで:秒で

CREATE PROCEDURE [dbo].[BrowseCODA] 
@GLAccountStart int = NULL 
, @GLAccountEnd int = NULL 
, @CustomerID int = NULL 
, @VendorID int = NULL 
, @StoreID nvarchar(2) = NULL 
, @DocDateStart date = NULL 
, @DocDateEnd date = NULL 
, @InputDateStart date = NULL 
, @InputDateEnd date = NULL 
, @AcctPeriodStart int = NULL 
, @AcctPeriodEnd int = NULL 
, @AcctYearStart int = NULL 
, @AcctYearEnd int = NULL 
, @PaymentID int = NULL 
, @ExtRef1 nvarchar(30) = NULL 
, @ExtRef2 nvarchar(30) = NULL 
, @ExtRef3 nvarchar(30) = NULL 
, @ExtRef4 nvarchar(30) = NULL 
, @ExtRef5 nvarchar(30) = NULL 
, @ExtRef6 nvarchar(30) = NULL 

AS 
BEGIN 
SET NOCOUNT ON; 

、一時テーブル変数を使用していない、ちょうどテーブルから直接報告しています。 3番目に、動的SQLを使用して、OPTION RECOMPILEを使用した場合にのみNULL以外の値のクエリを作成する方が効果的です。

関連する問題