2016-06-27 7 views
0

최종 사용자가 특정 검색 기준을 입력하지 않도록 허용하는 동적 SQL 쿼리를 작성하려고합니다. 이 예제에서는 최종 사용자가 @GLAccountEnd 값을 입력하지 않고 @GLAccountStart의 값을 입력 할 수 있고 이 올바르게 실행되는 "IF ..."문이 있어야합니다.동적 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

현재 공백 값을 전달할 수 있도록 텍스트입니다. –

답변

1

@GLAccountEnd가 SSRS에서 Null 값을 가져 오지 않는 것 같습니다. 하지만 간단한 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. 첫 번째와 두 번째를 모두 입력하면 검색 값이 그 사이에 있습니다. –

+0

그래서 끝 날짜를 비워 두시겠습니까? – vercelli

+0

예. 끝 부분을 비워두면 GLAccount = @GLAccountStart 인 행이 반환되어야합니다. –

0

SSRS 분명히 NULL 대신 ''을 의미하는 매개 변수의 입력의 부족을합니다. 값이 ''와 같은지 여부를 확인하기 위해 동적 쿼리를 변경하면 코드가 의도 한대로 작동합니다.

+0

예, 그게 내가 게시 한 SP에 있습니다. – vercelli

관련 문제