是否可以在SQL Server中构建查找类型的函数,或者这些性能总是比编写子查询/联接差(性能)?
我想要一些这样的代码
SELECT
ContactId,
ProductType,
SUM(OrderAmount) TotalOrders
FROM
(
SELECT
ContactId,
ProductType,
OrderAmount
FROM
UserOrders ord
JOIN
(
SELECT
ProductCode,
CASE
--Complex business logic
END ProductType
FROM
ItemTable
) item
ON
item.ProductCode=ord.ProductCode
) a
GROUP BY
ContactId,
ProductType
而是能够编写这样的查询
SELECT
ContactId,
UDF_GET_PRODUCT(ProductCode) ProductType,
SUM(OrderAmount) TotalOrders
FROM
UserOrders
GROUP BY
ContactId,
UDF_GET_PRODUCT(ProductCode)
有可能,但不是您所描述的格式。是否建议真的要视情况而定。
我同意其他答案,因为标量函数是性能的杀手,我个人根本不使用它们。话虽如此,我认为这不是在可行的情况下忽略DRY原理的原因。也就是说,如果它对性能有影响,我不会走捷径,但是我也不喜欢在多个地方重复复杂逻辑的想法。当任何事情发生变化时,您将有多个查询要更改,并且不可避免地会遗漏一些查询,因此,如果您将重用此逻辑,则将其封装在一个地方是个好主意。
根据您的示例,一个视图也许是最合适的:
CREATE VIEW dbo.ItemTableWithLogic
AS
SELECT ProductCode,
ProductType = <your logic>
FROM ItemTable;
然后,您可以简单地使用:
SELECT ord.ContactId, item.ProductType, SUM(ord.OrderAmount) AS TotalOrders
FROM UserOrders AS ord
INNER JOIN dbo.ItemTableWithLogic AS item
ON item.ProductCode=ord.ProductCode
GROUP BY ord.ContactId, item.ProductType;
这在某种程度上简化了事情。
另一个选择是内联表值函数,类似于:
CREATE FUNCTION dbo.GetProductType (@ProductCode INT)
RETURNS TABLE
AS
RETURN
( SELECT ProductType = <your logic>
FROM ItemTable
WHERE ProductCode = @ProductCode
);
可以使用以下方法调用:
SELECT ord.ContactId, item.ProductType, SUM(ord.OrderAmount) AS TotalOrders
FROM UserOrders AS ord
CROSS APPLY dbo.ItemTableWithLogic(ord.ProductCode) AS item
GROUP BY ord.ContactId, item.ProductType;
我的首选是查看表值函数,但是,这实际上取决于您的建议使用方式,因此,我真的不想挑剔,我会坚持坐在篱笆上。
总之,如果您只需要在一个地方使用逻辑,并且不需要在很多查询中重用它,那么只需坚持使用子查询即可。如果您需要多次重用相同的逻辑,请不要像在过程语言中那样使用标量值函数,也不要让此方法排除将逻辑保持在同一位置的其他方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句