Значение по умолчанию при сбое инструкции подзапроса?

#sql #sql-server #tsql #sql-server-2016

#sql #sql-сервер #tsql #sql-server-2016

Вопрос:

У меня есть следующий запрос:

     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)

            );
  

Ответ №1:

Max всегда возвращает NULL , если строки не найдены. Итак, вы можете использовать ISNULL .

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