エンドユーザが特定の検索条件を入力しないようにする動的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
@あなたのパラメータ定義をSSRSに投稿してください。 'GLAccountEnd'は整数かテキストですか? – vercelli
現在、空白の値を渡すことができるようにTextです。 –