2016-10-24 2 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

Смежные вопросы