我正在开发一个接受3个不同参数的项目,日期是必需的,First和Last名称是可选的。我们在下面设置了查询,但即使我更改了报告(SSRS)上的参数,它仍然将@LetterCreated视为'1/1/1950',关于我如何才能接受参数的任何想法?我们以这种方式设置日期,因为我们希望报告在最初打开时显示所有报告。
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
任何建议都将不胜感激。
答案 0 :(得分: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
答案 1 :(得分:0)
与podiluska的答案类似,您应该将参数设置为SP的一部分,如podiluska所示,但是您应该在参数中设置SSRS中的默认值。
这将允许用户查看默认值并将其用于订阅,或根据需要覆盖它们。
答案 2 :(得分:0)
Alter Proc Proc_Name
(
@LetterCreated DATETIME,
@FirstName VARCHAR(20) = null,
@LastName VARCHAR(20) = null
)
AS
BEGIN
SET NOCOUNT ON;
这会将空值作为默认值传递给您。如果没有为FirstName和LastName提供值
,则现在代码应该能够处理空值答案 3 :(得分:0)
我在这里猜测,但你可能想要的是
@LetterCreated
为空,则不应将其用作所有RedFlagData.LETTERCREATETIME
中的数据为空,则应将其与过滤日期'07/05/81'
FWR 假设您对RDL/RDLC
@LetterCreated
的{{1}}集进行'允许空值'检查,则需要更改parameter
,可选的过滤器可以是设置如下:
where
如果你摆脱了魔法日期,那么过滤器可以保证即使ISNULL(@LetterCreated, LETTERCREATETIME) = ISNULL(LETTERCREATETIME, '07/05/81')
为空也不会应用日期过滤器:
LETTERCREATETIME
因此:
ISNULL(@LetterCreated, LETTERCREATETIME) = ISNULL(LETTERCREATETIME)
OR
(@LetterCreated IS NULL AND LETTERCREATETIME IS NULL)
一个警告:鉴于where子句中的函数操作量,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
和LIKEs
- 希望ORs
相对较小,此查询的性能会很糟糕表?如果没有,您可能需要rethink your approach