如果您考虑到性能,那么最好在需要时重复表达式。具体来说,不要尝试将它们放在用户定义的函数中。众所周知,它们会使sql Server中的查询变慢。
话虽如此,sql Server中至少有两种方法可以使查询在不影响性能的情况下更具可读性:
使用CTE的示例:
WITH
CTE
AS
(
SELECT
...
, DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) AS CalculatedColumn
...
FROM
dbo.AspNetUsers U
)
SELECT
...
CalculatedColumn
...
FROM CTE
WHERE
CalculatedColumn < 3
;
使用示例CROSS APPLY
:
而不是在以下查询中重复公式的某些部分:
SELECT
ColA + ColB AS ColSum
,ColA - ColB AS ColDiff
,(ColA + ColB) * (ColA - ColB) AS Result
,(ColA + ColB) * (ColA - ColB) * 100.0 AS Percentage
FROM Table
您可以CROSS APPLY
这样写:
SELECT
ColSum
,ColDiff
,Result
,Result * 100.0 AS Percentage
FROM
Table
CROSS APPLY
(
SELECT
ColA + ColB AS ColSum
,ColA - ColB AS ColDiff
) AS A1
CROSS APPLY
(
SELECT ColSum * ColDiff AS Result
) AS A2
顺便说一句,谈到性能,
WHERE DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) < 3
太糟糕了,因为它不能使用索引DateCreated
(因为您将列包装在函数中)。
您最好将其重写为类似
WHERE U.DateCreated > DATEADD(DAY, -3, GETUTCDATE())