SQL Server должен быть достаточно умным, чтобы выполнять запросы только один раз.Оптимизатор должен точно понимать, что вы делаете - это постоянные значения.Например, следующий запрос возвращает то же значение для id
:
with cte as (
select v.*,
(select top 1 newid() from (values (1), (2)) v2(n) order by newid()) as val
from (values (1), (2)) v(n)
)
select *
from cte;
( Здесь - это db <> скрипка.)
Если вы хотитечтобы убедиться, что они вычисляются только один раз, вы можете переместить логику в предложение FROM
:
CREATE VIEW TopOrganisationAddresses AS
SELECT oa.OrganisationID, oa.AddressID,
ROW_NUMBER() OVER (PARTITION BY oa.OrganisationID
ORDER BY v.OrderFirst DESC, v.OrderSecond DESC
) AS [Row]
FROM OrganisationAddresses oa CROSS JOIN
(VALUES (CASE WHEN EXISTS (SELECT * FROM GlobalSettings WHERE DeliveryAddressInReports = 1) THEN IsDeliveryAddress ELSE IsInvoiceAddress END,,
CASE WHEN EXISTS (SELECT * FROM GlobalSettings WHERE DeliveryAddressInReports = 1) THEN IsInvoiceAddress ELSE IsDeliveryAddress END)
) v(OrderFirst, OrderSecond);