0

假设我有一个像这样的存储过程:

CREATE PROCEDURE People_Select
    @LastName   nvarchar(25)    = NULL,
    @FirstName  nvarchar(25)    = NULL,
AS
BEGIN 

    SET NOCOUNT ON;

    SELECT *
    FROM People
    WHERE (@LastName IS NULL OR (LastName = @LastName))
      AND (@FirstName IS NULL OR (FirstName = @FirstName))

    OPTION (RECOMPILE)

END

当它被执行并设置了至少一个(或两个)参数时,它可以完美地工作。但是,如果有人碰巧在没有设置任何参数的情况下调用它,它将返回 People 表中的所有行。这是有问题的,特别是如果我的 People 表有数百万条记录。

如果未设置任何参数,首选功能(在我的情况下)将是它不返回任何内容。我可以很容易地检查 lastName 是否为 null 并且 firstname 是否为 null 并且什么都不返回,但是有没有更优雅的方法呢?如果我的存储过程有 20 个可选参数怎么办?我不想先检查它们是否全部为空并且什么也不返回。有没有更简单的方法?谢谢。

4

1 回答 1

0

尝试以下

CREATE PROCEDURE People_Select
    @LastName   nvarchar(25)    = NULL,
    @FirstName  nvarchar(25)    = NULL,
AS
BEGIN 

    IF @LastName is null and @FirstName is null
        goto end_section:

    SET NOCOUNT ON;

    SELECT *
    FROM People
    WHERE (@LastName IS NULL OR (LastName = @LastName))
      AND (@FirstName IS NULL OR (FirstName = @FirstName))

    OPTION (RECOMPILE)
end_section:
END
于 2013-06-06T14:44:42.697 回答