动态 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。当我更改动态查询以检查值是否等于 '' 时,代码按预期工作。
我正在尝试编写一个动态 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。当我更改动态查询以检查值是否等于 '' 时,代码按预期工作。