在 FROM 中重复使用多个 UDF 的参数会引发无效的列名错误
Repeated use of parameter for multiple UDF's in FROM throws an invalid column name error
在如下查询中使用多个 table 值函数时,SSMS 会抛出错误。此外,[PRECALCPAGES_asof] 的 [Date] 参数带有红色下划线。
我想了解为什么会失败。我认为这可能与 SQL 服务器引擎的工作方式有关。已经查看了 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
我认为您不能将表中的字段用作联接中函数的参数。你应该使用交叉应用。
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]
在如下查询中使用多个 table 值函数时,SSMS 会抛出错误。此外,[PRECALCPAGES_asof] 的 [Date] 参数带有红色下划线。
我想了解为什么会失败。我认为这可能与 SQL 服务器引擎的工作方式有关。已经查看了 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
我认为您不能将表中的字段用作联接中函数的参数。你应该使用交叉应用。
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]