是否从表值函数中选择?

问题描述 投票:0回答:2

视图是否可以从表值函数中选择列?

CREATE FUNCTION fnGetLatestOrderStatus(@OrderId int)
RETURNS TABLE
AS
RETURN 
    SELECT TOP (1) Status, TimestampUtc    
    FROM OrderStatusHistory
    ORDER BY TimestampUtc DESC
GO

CREATE VIEW MyView AS
SELECT  
    OrderId,
    CustomerId,
    fnGetLatestOrderStatus(OrderId).Status AS OrderStatus,
    fnGetLatestOrderStatus(OrderId).TimestampUtc AS OrderStatusTimestamp
FROM Orders
GO

SSMS不喜欢此错误

找不到列“ fnGetLatestOrderStatus”或用户定义的函数或聚合“ fnGetLatestOrderStatus”,或者名称不明确。

sql sql-server tsql view user-defined-functions
2个回答
2
投票

这是您想要做的吗?

SELECT o.OrderId, o.CustomerId, flos.*
FROM Orders o CROSS APPLY
     dbo.fnGetLatestOrderStatus(o.OrderId int) flos;

您需要在FROM子句中调用表值函数。


1
投票

如果语法正确,则可能。注意:

  1. 功能必须完全合格,包括架构名称(我假设是dbo)。
  2. 您可以根据任何常规查询从函数中选择,而不是像以前那样使用对象引用表示法。
    CREATE VIEW MyView
    AS
    SELECT  
      OrderId
      , CustomerId
      , (select Status from dbo.fnGetLatestOrderStatus(OrderId)) AS OrderStatus
      , (select TimestampUtc from dbo.fnGetLatestOrderStatus(OrderId)) AS OrderStatusTimestamp
    FROM Orders
    GO

注意:戈登的解决方案可能更适合您的问题,但我认为值得指出两个错误以供您参考

© www.soinside.com 2019 - 2024. All rights reserved.