如果您考虑到性能,那么最好在需要时重复表达式。具体来说,不要尝试将它们放在用户定义的函数中。众所周知,它们会使SQL Server中的查询变慢。
话虽如此,SQL Server中至少有两种方法可以使查询在不影响性能的情况下更具可读性:
- CTE
- CROSS APPLY
使用CTE的示例:
WITHCTEAS( SELECt ... , DATEDIFF(DAY, U.DateCreated, GETUTCDATE()) AS CalculatedColumn ... FROM dbo.AspNetUsers U)SELECt ... CalculatedColumn ...FROM CTEWHERe 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 PercentageFROM Table
您可以
CROSS APPLY这样写:
SELECt ColSum ,ColDiff ,Result ,Result * 100.0 AS PercentageFROM 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())



