2012-07-18 31 views
3

例如:有没有办法让SELECT失败不会抛出TRY/CATCH?

CREATE PROCEDURE dbo.MyProc 
AS 
BEGIN 
    SET NOCOUNT ON; 
    BEGIN TRY 
    ... 
    DECLARE @Id INT; 

    -- I don't want the following line to throw and abort processing. 
    -- I just want @Id to remain NULL. I can add a nested TRY/CATCH, but is there 
    -- a better way? 
    SET @Id=(SELECT Id FROM MyTable WHERE ...); 
    ... 
    END TRY 
    BEGIN CATCH 
    ... 
    END CATCH; 
END; 

更新:只是为了澄清,如果返回了多行,我想@Id留NULL。

+1

您对该选择有何期望的错误?你能避免顶级1的预期错误吗?如果没有匹配,@ID将保持为空。 – 2012-07-18 18:37:32

+0

我希望@Id保持NULL,如果有多个ID返回,按照Jose的第二个答案... – 2012-07-18 18:49:58

回答

3

我会做这样的事情,以避免多行错误:

SELECT top 1 @Id = Id FROM MyTable WHERE ... 

或本

SELECT @Id = Id FROM MyTable WHERE ... 
if @@rowcount > 1 
    set @id = null 

这最后一块会当有多行时,将@Id设置为null。

+0

但它听起来像是,如果有多行,OP要它为空,不只是有一个值 – 2012-07-18 18:42:15

+0

我认为第二个查询是OP正在寻找。第一个不符合他的要求“我只是希望@Id保持NULL”。 – 2012-07-18 18:48:52

+0

Stefan,你是对的。 – 2012-07-18 18:49:06

1

很肯定这不会抛出:

SELECT @Id = Id FROM MyTable WHERE ... 
+0

但这只是存储最后一个值,我不认为是OP想要的 – 2012-07-18 18:37:58

+0

@RGI - 你是什么谈论? @ Stefan H - 存储最后一个值? – EkoostikMartin 2012-07-18 18:39:27

+0

@RGI如果子查询返回多个结果,那么OP帖子会抛出一个错误,但这不是 – 2012-07-18 18:39:40

2

试试这个:

select @id = (select max(id) from MyTable Where <YOUR CONDITION> Having count(1) = 1) 

这将返回一个单行,或没有行如果有多个匹配。

+0

我认为Ben的解决方案非常优雅,并且执行类似于if @@ rowcount。 – 2012-07-18 19:02:10

相关问题