Multi-déclaration de la Fonction à valeur de Table vs Inline Fonction à valeur de Table

Quelques exemples pour montrer, juste au cas où:

Inline Table

CREATE FUNCTION MyNS.GetUnshippedOrders()
RETURNS TABLE
AS 
RETURN SELECT a.SaleId, a.CustomerID, b.Qty
    FROM Sales.Sales a INNER JOIN Sales.SaleDetail b
        ON a.SaleId = b.SaleId
        INNER JOIN Production.Product c ON b.ProductID = c.ProductID
    WHERE a.ShipDate IS NULL
GO

Multi Déclaration Table

CREATE FUNCTION MyNS.GetLastShipped(@CustomerID INT)
RETURNS @CustomerOrder TABLE
(SaleOrderID    INT         NOT NULL,
CustomerID      INT         NOT NULL,
OrderDate       DATETIME    NOT NULL,
OrderQty        INT         NOT NULL)
AS
BEGIN
    DECLARE @MaxDate DATETIME

    SELECT @MaxDate = MAX(OrderDate)
    FROM Sales.SalesOrderHeader
    WHERE CustomerID = @CustomerID

    INSERT @CustomerOrder
    SELECT a.SalesOrderID, a.CustomerID, a.OrderDate, b.OrderQty
    FROM Sales.SalesOrderHeader a INNER JOIN Sales.SalesOrderHeader b
        ON a.SalesOrderID = b.SalesOrderID
        INNER JOIN Production.Product c ON b.ProductID = c.ProductID
    WHERE a.OrderDate = @MaxDate
        AND a.CustomerID = @CustomerID
    RETURN
END
GO

Est-il un avantage à l'utilisation d'un seul type (en ligne ou multi déclaration) sur l'autre? Est-t-il des scénarios lorsque l'une est meilleure que l'autre ou les différences sont purement syntaxiques? Je me rends compte que les deux exemples de requêtes sont en train de faire différentes choses, mais est-il une raison pour laquelle je voudrais écrire de cette façon?

Lire à leur sujet, et les avantages et les différences n'ont pas été expliquées.

Aussi l'un des énormes avantages de la fonction en ligne est que vous pouvez choisir ROWID(TIMESTAMP) colonnes, tandis que vous ne pouvez pas insérer de données TIMESTAMP à la table de retour dans les instructions multiples fonctions!
Merci pour un excellent thread. J'ai appris beaucoup de choses. Cependant, une chose à garder à l'esprit lors de la modification d'une fonction qui a été ITV à MSTV, le profileur pense que vous êtes la modification d'une ITV. Peu importe ce que vous faites pour obtenir la syntaxe de droit à partir d'une ZONE de point de vue, le recompiler échoue toujours, généralement autour de la première instruction après avoir COMMENCER. La seule façon de contourner ce problème est d'abandonner la vieille de la fonction et de CRÉER le nouveau MSTV.

OriginalL'auteur AndrewC | 2010-03-31