2016-06-27 7 views
0

エンドユーザが特定の検索条件を入力しないようにする動的SQLクエリを作成しようとしています。この例では、エンドユーザが@GLAccountEndの値を入力せずに@GLAccountStartの値を入力できるようにしたいと考えています。IF ...の文は@GLAccountStart IS NOT NULL and @GLAccountEnd IS NULLが正しく実行されます。ダイナミックSQLはnull変数をSSRSに渡すことができません

しかし、これをSSRSで実行しようとすると、最初の値を入力すると0行(2を返す)が返され、両方の変数の値を入力すると実際に正しい行数が返されます。さらに、@GLAccountEnd変数をスクリプトから完全に削除し、@GLAccountStartを含めるオプションを指定して実行すると、SSRSは適切な数の行を適切な入力で返します。

これを実装するためのトリックなどはありますか?

USE [DataWarehouse] 
GO 

/****** Object: StoredProcedure [dbo].[BrowseCODA] Script Date: 6/27/2016 8:37:37 AM ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 


ALTER PROCEDURE [dbo].[BrowseCODA] 
@GLAccountStart int, 
@GLAccountEnd int 
AS 
SET NOCOUNT ON; 

DECLARE @SQLQuery AS nvarchar(4000) 
DECLARE @ParameterDef AS nvarchar(2000) 

SET @SQLQuery = 'SELECT * 
      FROM [DataWarehouse].[dbo].[VDocDetails] 
      WHERE Company+''-''+FullDocNumber IN 
        (SELECT Company+''-''+FullDocNumber 
        FROM [DataWarehouse].[dbo].[VDocDetails] 
        WHERE (1=1)' 
IF (@GLAccountStart IS NOT NULL) AND (@GLAccountEnd IS NOT NULL) 
    SET @SQLQuery = @SQLQuery + ' AND (GLAccount >= @GLAccountStart) AND (GLAccount <= @GLAccountEnd)' 
IF (@GLAccountStart IS NOT NULL) AND (@GLAccountEnd IS NULL) 
    SET @SQLQuery = @SQLQuery + ' AND (GLAccount = @GLAccountStart)' 
SET @SQLQuery = @SQLQuery + ')' 

SET @ParameterDef = 
'@GLAccountStart int, 
@GLAccountEnd int' 

EXECUTE sp_Executesql @SQLQuery, 
         @ParameterDef, 
         @GLAccountStart, 
         @GLAccountEnd 

IF @@ERROR <> 0 GOTO ErrorHandler 
SET NOCOUNT OFF 
RETURN(0) 

ErrorHandler: 
Return(@@ERROR) 

GO 
+0

@あなたのパラメータ定義をSSRSに投稿してください。 'GLAccountEnd'は整数かテキストですか? – vercelli

+0

現在、空白の値を渡すことができるようにTextです。 –

答えて

1

@GLAccountEndはSSRSからヌル値を取得していないと思います。 しかし、単純なSQLを試してみませんか?

SELECT * 
    FROM [DataWarehouse].[dbo].[VDocDetails] 
    where GLAccount between @GLAccountStart 
         AND case @GLAccountEnd 
          when '' then @GLAccountStart 
          else @GLAccountEnd end 

または動的:

USE [DataWarehouse] 
GO 

/****** Object: StoredProcedure [dbo].[BrowseCODA] Script Date: 6/27/2016 8:37:37 AM ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 


ALTER PROCEDURE [dbo].[BrowseCODA] 
@GLAccountStart varchar, 
@GLAccountEnd varchar 
AS 
SET NOCOUNT ON; 

DECLARE @SQLQuery AS nvarchar(4000) 
DECLARE @ParameterDef AS nvarchar(2000) 

SET @SQLQuery = 'SELECT * 
        FROM [DataWarehouse].[dbo].[VDocDetails] 
        WHERE (1=1)' 
IF (@GLAccountStart <> '') AND (@GLAccountEnd <> '') 
    SET @SQLQuery = @SQLQuery + ' AND (GLAccount >= @GLAccountStart) AND (GLAccount <= @GLAccountEnd)' 
IF (@GLAccountStart <> '') AND (@GLAccountEnd = '') 
    SET @SQLQuery = @SQLQuery + ' AND (GLAccount = @GLAccountStart)' 

SET @ParameterDef = 
'@GLAccountStart int, 
@GLAccountEnd int' 

EXECUTE sp_Executesql @SQLQuery, 
         @ParameterDef, 
         @GLAccountStart, 
         @GLAccountEnd 

IF @@ERROR <> 0 GOTO ErrorHandler 
SET NOCOUNT OFF 
RETURN(0) 

ErrorHandler: 
Return(@@ERROR) 

GO 
+0

エンドユーザはSSRSで「NULL」をチェックする必要があります。そうした場合、そのような問題には慣れていません。基本的に、私は彼らが現在使っている古いコンピュータプログラムを真似しようとしています。 1.範囲の最初の値を入力し、2番目の値を空白のままにした場合、検索値=最初の値の文書のみが返されます。 2. 1番目と2番目の両方を入力すると、検索値がそれらの間に入ります。 –

+0

ですので、終了日は空のままにしていますか? – vercelli

+0

はい。最後にGLAccount = @GLAccountStartが返された行が返されるようにしてください(SHOULD)。 –

0

SSRSは明らかに代わりにNULLを '' を意味するパラメータで入力の欠如を取ります。値が ''と等しいかどうかを確認するために動的クエリを変更したとき、コードは意図したとおりに動作しました。

+0

はい、それは私が投稿したspのです。 – vercelli

関連する問題