2016-10-24 9 views
1

は、私は次のクエリがありますサブクエリ文が失敗した場合のデフォルト値は?

INSERT INTO dbo.ResourceOrderCustomersOrders 
      (OrderId , 
       Type , 
       CustomerId , 
       ResourceId , 
       Quantity , 
       Created , 
       CreatedBy    
      ) 
    VALUES ((SELECT MAX(OrderId) + 1 
       FROM dbo.ResourceOrderCustomersOrders 
      ) , -- OrderId - int 
       'PENDING' , -- Type - varchar(50) 
       (SELECT MAX(CustomerId) 
       FROM dbo.ResourceOrderCustomers 
       WHERE UPPER(FirstName) = UPPER(@Firstname) 
         AND UPPER(Surname) = UPPER(@Surname) 
         AND UPPER(Email) = UPPER(@Email) 
      ) , -- CustomerId - int 
       (SELECT MAX(ResourceId) 
       FROM dbo.ResourceOrderFormContent 
       WHERE DisplayTitle = @ResourceName 
      ) , -- ResourceId - int 
       @ResourceQuantity , 
       GETDATE() , -- Created - datetime 
       'WebsiteForm' -- CreatedBy - varchar(20) 

      ); 

例でサブクエリが、私は私が選んだの値をデフォルトにしたいのですが失敗した(未指定のレコードを保持するために)。例えば

は、レコードが存在しないため、結果を取得するために失敗し、次だった:

SELECT MAX(ResourceId) 
FROM dbo.ResourceOrderFormContent 
WHERE DisplayTitle = @ResourceName 

その後、私は数「999」(不特定のレコード)を返すようにしたいでしょう。これに接近する最善の方法は何でしょうか?

私はtry/catchを使用しようとしましたが、これは無効な構文であると言われています。ここに私の試みは次のとおりです。行が見つからない場合

INSERT INTO dbo.ResourceOrderCustomersOrders 
      (OrderId , 
       Type , 
       CustomerId , 
       ResourceId , 
       Quantity , 
       Created , 
       CreatedBy    
      ) 
    VALUES ((SELECT MAX(OrderId) + 1 
       FROM dbo.ResourceOrderCustomersOrders 
      ) , -- OrderId - int 
       'PENDING' , -- Type - varchar(50) 
       (SELECT MAX(CustomerId) 
       FROM dbo.ResourceOrderCustomers 
       WHERE UPPER(FirstName) = UPPER(@Firstname) 
         AND UPPER(Surname) = UPPER(@Surname) 
         AND UPPER(Email) = UPPER(@Email) 
      ) , -- CustomerId - int 
       (BEGIN TRY 
        SELECT MAX(ResourceId) 
        FROM dbo.ResourceOrderFormContent 
        WHERE DisplayTitle = @ResourceName 
       END TRY 
       BEGIN CATCH 
        SELECT 999 
       END CATCH 
      ) , -- ResourceId - int 
       @ResourceQuantity , 
       GETDATE() , -- Created - datetime 
       'WebsiteForm' -- CreatedBy - varchar(20) 

      ); 

答えて

4

Maxは常にNULLを返します。したがって、ISNULLを使用することができます。

SELECT ISNULL(MAX(ResourceId), 999) 
FROM dbo.ResourceOrderFormContent 
WHERE DisplayTitle = @ResourceName 
+0

Oh duh。私の脳は今日働いていません - ありがとう! – Codingo

関連する問題