将参数传递给存储过程

时间:2013-10-22 16:00:56

标签: sql sql-server sql-server-2008 stored-procedures reporting-services

我正在开发一个接受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

任何建议都将不胜感激。

4 个答案:

答案 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