[英]Passing Parameters to a stored Procedure
我正在一个接受3个不同参数的项目中,日期是必需的,名字和姓氏是可选的。 我们在下面设置查询,但是即使我更改报表(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
任何建议将不胜感激。
您正在过程中设置@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
与podiluska的答案类似,应按照podiluska的指示将参数设置为SP的一部分,但随后应在SSRS中的“参数”中设置默认值。
这将使用户可以看到默认值并将其用于订阅,或者根据需要覆盖它们。
Alter Proc Proc_Name
(
@LetterCreated DATETIME,
@FirstName VARCHAR(20) = null,
@LastName VARCHAR(20) = null
)
AS
BEGIN
SET NOCOUNT ON;
这会将空值作为默认值传递给您,现在,如果没有为FirstName和LastName提供值,则您的代码应该能够处理空值
我猜这里,但是您可能想要的是
@LetterCreated
为null,则根本不应将其用作过滤器 RedFlagData.LETTERCREATETIME
的数据为Null,则应将其与过滤日期'07/05/81'
07/05/81 '07/05/81'
匹配 假设您已为@LetterCreated
parameter
设置了RDL/RDLC
的“允许空值”检查where
需要更改的位置,可以如下设置可选过滤器:
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子句中的功能操作量以及LIKEs
和ORs
,该查询的性能将很糟糕-希望RedFlagAddress
是一个相对较小的表? 如果没有,您可能需要重新考虑您的方法
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.