3

例えば:

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のままにしておきます。

4

3 に答える 3

3

複数行のエラーを回避するために、次のようなことを行います。

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

またはこれ

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

この最後の部分は、複数の行があった場合に@Idをnullに設定します。

于 2012-07-18T18:41:48.023 に答える
2

これを試して:

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

これにより、単一の行が返されるか、一致するものが複数ある場合は行が返されません。

于 2012-07-18T18:59:11.897 に答える
1

これがスローされないことはかなり確実です:

SELECT @Id = Id FROM MyTable WHERE ...
于 2012-07-18T18:35:41.257 に答える