动态 SQL 不允许我将空变量传递给 SSRS

Dynamic SQL won't allow me to pass null variables to SSRS

我正在尝试编写一个动态 SQL 查询,允许最终用户选择不输入某些搜索条件。在此示例中,我希望最终用户能够在不输入 @GLAccountEnd 的情况下输入 @GLAccountStart 的值,并使用“IF ...”语句,其中 @GLAccountStart IS NOT NULL and @GLAccountEnd IS NULL正确执行。

当我在 SSRS 中尝试 运行 时,只输入第一个值 returns 0 行(它应该 return 2),并为两个变量输入值实际上 return 是正确的行数。此外,如果我从我的脚本中完全删除 @GLAccountEnd 变量,只删除 运行 它并选择包含 @GLAccountStart,SSRS returns 正确的行数和正确的输入。

有什么技巧可以实现吗?

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

我猜@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

SSRS 显然将参数中缺少输入表示为“”而不是 NULL。当我更改动态查询以检查值是否等于 '' 时,代码按预期工作。