代码之家  ›  专栏  ›  技术社区  ›  Slicc

在Azure SQL数据仓库中是否有返回表类型的函数的替代方法?

  •  0
  • Slicc  · 技术社区  · 5 年前

    在常规SQL Server数据库中,我有一个函数返回表类型,如下所示:

    CREATE FUNCTION [dbo].[GetSomeStuff] 
    (   
        @UserID INT
    )
    RETURNS TABLE 
    AS
    RETURN 
    (...
    

    从各种存储过程调用函数。我希望将存储过程和此函数一起迁移到Azure SQL数据仓库,但不支持表类型。

    有人能告诉我我能做什么而不是在这里返回表类型的函数吗?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Ron Dunn    5 年前

    您是正确的,不支持表类型。

    您可以使用CTE,下面是一个在我的DW上运行的简单查询:

    with ProductSales as (
        select ProductID,
               sum(OrderQty) as UnitsSold 
        from SalesLT.SalesOrderDetail 
        group by ProductID
        ) 
    select * 
    from ProductSales 
    order by UnitsSold desc;
    

    也就是说,我经常发现CTE在复杂的查询中性能非常差,并且更喜欢将CTE具体化为一个单独的查询,以便控制其结构和分布。

    我认为物化是解决你问题的正确答案。考虑使用在存储过程中创建的临时表来替换函数调用。ASDW临时表是会话范围的,保留在创建它们的过程之外。

    https://docs.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-tables-temporary