我有一个基于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个选择,这看起来多余且效率低,而另一个检查意味着另一个选择等。是否有更好的模式(例如临时表)?
更新:编辑第一次检查
答案 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