1

我正在开发一个接受 3 个不同参数的项目,日期是必需的,名字和姓氏是可选的。我们在下面设置了查询,但是即使我更改了报告(SSRS)上的参数,它仍然将@LetterCreated 视为“1950 年 1 月 1 日”,关于如何让它只接受参数的任何想法?我们以这种方式设置日期是因为我们希望报表在最初打开时与所有报表一起显示。

Alter Proc
AS 
BEGIN
SET NOCOUNT ON;

    DECLARE @LetterCreated DATETIME,
    @FirstName VARCHAR(20),
    @LastName VARCHAR(20) 

    SELECT @LetterCreated = '1/1/1950'
    SELECT @FirstName = ''
    SELECT @LastName = ''

    SELECT  
        LETTERCREATETIME,
        Firstname,
        LastName,
    From RedFlagAddress

    WHERE 
        CASE WHEN @LetterCreated='1/1/1950' 
             THEN '1/1/1950' 
             ELSE ISNULL(LETTERCREATETIME, '07/05/81')
        END = @LetterCreated 
    AND (LastName LIKE @LASTNAME + '%' AND FirstName LIKE @FirstNAME + '%')
    END

任何建议将不胜感激。

4

4 回答 4

2

您正在设置@lettercreated过程中的日期。在过程中定义的变量在过程之外是不可见的。

您应该将参数声明为参数,并在声明中设置默认值

ALTER PROC yourproc
(
@LetterCreated DATETIME = '1950-1-1',
@FirstName VARCHAR(20) = '',
@LastName VARCHAR(20) = ''
)
as
begin
    select  
        LETTERCREATETIME,
        Firstname,
        LastName,
    From 
        RedFlagAddress
    where 
    (
         ISNULL(LETTERCREATETIME, '07/05/81') = @LetterCreated
         or
         @LetterCreated = '1950-1-1'
    )
    AND LastName LIKE @LASTNAME + '%' 
    AND FirstName LIKE @FirstNAME + '%'
end
于 2013-10-22T16:03:28.440 回答
0

我猜在这里,但你可能想要的是

  • IF 参数@LetterCreated为空,那么它根本不应该用作过滤器
  • 如果输入的数据RedFlagData.LETTERCREATETIME为 Null,那么它应该与'07/05/81'FWR的过滤日期匹配

假设您对RDL/RDLC集合进行了“允许空值”检查@LetterCreated parameterwhere需要更改,可选过滤器可以设置如下:

ISNULL(@LetterCreated, LETTERCREATETIME) = ISNULL(LETTERCREATETIME, '07/05/81')

如果您摆脱了魔术日期,那么即使LETTERCREATETIME为空,您也可以通过过滤器保证不应用日期过滤器:

ISNULL(@LetterCreated, LETTERCREATETIME) = ISNULL(LETTERCREATETIME) 
OR 
(@LetterCreated IS NULL AND LETTERCREATETIME IS NULL)

因此:

ALTER PROC XYZ
(
  @LetterCreated DATETIME,
  @FirstName VARCHAR(20) = NULL,
  @LastName VARCHAR(20) = NULL
)
as
begin
    select  
        LETTERCREATETIME,
        Firstname,
        LastName,
    From 
        RedFlagAddress
    where 
    (
       ISNULL(@LetterCreated, LETTERCREATETIME) = LETTERCREATETIME
       OR
       (@LetterCreated IS NULL AND LETTERCREATETIME IS NULL)
    )
    AND LastName LIKE ISNULL(@LastName, '') + '%'
    AND FirstName LIKE ISNULL(@FirstName, '') + '%'
end

一个警告:这个查询的性能会很糟糕,考虑到 where 子句中的功能操作量,LIKEsand ORs- 希望RedFlagAddress是一个相对较小的表?如果没有,您可能需要重新考虑您的方法

于 2013-10-22T16:27:38.923 回答
0
Alter Proc Proc_Name
(
@LetterCreated DATETIME,
@FirstName VARCHAR(20) = null,
@LastName VARCHAR(20) = null
)
AS 
BEGIN
SET NOCOUNT ON;

这会将空值作为默认值传递给您 Proc 现在如果没有为 FirstName 和 LastName 提供值,您的代码应该能够处理空值

于 2013-10-22T16:13:39.990 回答
0

与 podiluska 的回答类似,您应该将参数设置为 SP 的一部分,正如 podiluska 所指示的那样,但是您应该在 SSRS 中的“参数”中设置默认值。

这将让用户看到默认值并将其用于订阅,或根据需要覆盖它们。

于 2013-10-22T16:06:01.123 回答