根据所选数据返回不同的值

时间:2012-01-12 12:04:48

标签: sql tsql

我有一个基于id(足够简单)选择行的存储过程,但只有在数据满足一些条件时才返回实际​​结果,否则返回特定的错误代码。因此,在进行嵌套检查时,代码看起来就像这样:

CREATE PROCEDURE GetStuffById
@StuffId int
AS
BEGIN
IF EXISTS (SELECT TOP 1 * FROM [Stuff] WHERE StuffId = @StuffId)
    BEGIN
    DECLARE @IsValid bit
    SET @IsValid = (SELECT IsValid FROM [Stuff] WHERE StuffId = @StuffId)
    IF @IsValid = 1
        BEGIN
        --More nested checks may occur here
        SELECT * FROM [Stuff] WHERE StuffId = @StuffId
        END
    ELSE
        BEGIN
        RETURN -2
        END
    END
ELSE
    BEGIN
    RETURN -1
    END
END

在这种方法中,我已经在同一个表上有3个选择,这看起来多余且效率低,而另一个检查意味着另一个选择等。是否有更好的模式(例如临时表)?

更新:编辑第一次检查

1 个答案:

答案 0 :(得分:4)

您可以在一个选择中分配多个变量,并使用@@ROWCOUNT来检测是否找到了一行。

DECLARE @IsValid BIT,
        @Foo     INT

SELECT @IsValid = IsValid,
       @Foo = Foo
FROM   [Stuff]
WHERE  StuffId = @StuffId

/*This must be tested immediately after the assignment statement*/
IF @@ROWCOUNT = 0
  RETURN -1

IF ISNULL(@IsValid, 0) = 0
  RETURN -2

SELECT @IsValid AS IsValid,
       @Foo     AS Foo