SQL Server查询功能

会长

是否可以在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章