#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