2017-08-04 57 views
0

在类似查询的查询中使用多个表值函数时,SSMS会引发错误。另外,[PRECALCPAGES_asof]的[Date]参数以红色下划线。FROM中的多个UDF的参数重复使用会引发无效的列名称错误

我想了解为什么会失败。我认为这可能与SQL Server引擎的工作方式有关。已经查阅了MSDN上的文档,但不幸的是我不知道要寻找什么。为什么会造成这种情况并解决它?

查询

SELECT 
    [Date] 
    , COUNT(*) 
FROM 
    [Warehouse].[dbo].[DimDate] 
    CROSS APPLY 
    [PROJECTS_asof]([Date]) 
    INNER JOIN 
    [PRECALCPAGES_asof]([Date]) ON [PRECALCPAGES_asof].[PROJECTID] = [PROJECTS_asof].[PROJECTID] 
GROUP BY 
    [Date] 

错误

Msg 207, Level 16, State 1, Line 9 
Invalid column name 'Date'. 

功能

CREATE FUNCTION [ProfitManager].[PROJECTS_asof] 
(
    @date DATETIME 
) 
RETURNS TABLE AS 
RETURN 
(
    SELECT 
     [PROJECTID] 
     , [PROJECT] 
     , ... 
    FROM 
     Profitmanager.[PROJECTS_HISTORY] 
    WHERE 
     [RowStartDate] <= @date 
     AND 
     [RowEndDate] > @date 
) 
GO 

CREATE FUNCTION [ProfitManager].[PRECALCPAGES_asof] 
(
    @date DATETIME 
) 
RETURNS TABLE AS 
RETURN 
(
    SELECT 
     [PAGEID] 
     , [PAGENAME] 
     , ... 
    FROM 
     Profitmanager.[PRECALCPAGES_HISTORY] 
    WHERE 
     [RowStartDate] <= @date 
     AND 
     [RowEndDate] > @date 
) 
GO 

回答

2

我认为你不能使用领域˚F将表作为参数加入连接中的函数。你应该使用交叉应用。

SELECT 
    [Date] 
    , COUNT(*) 
FROM 
    [Warehouse].[dbo].[DimDate] 
    CROSS APPLY 
    [PROJECTS_asof]([Date]) 
    CROSS APPLY 
    [PRECALCPAGES_asof]([Date]) 
WHERE 
    [PRECALCPAGES_asof].[PROJECTID] = [PROJECTS_asof].[PROJECTID] 
GROUP BY 
    [Date] 
+0

非常感谢,这是我一直在寻找的答案! – RB84

+0

太好了,谢谢!如果解决了您的问题,请将答案标记为已接受。 – SAS

+0

你也许知道它为什么这样工作? – RB84

相关问题