Alcuni esempi per mostrare, solo in caso:Multi-TABLE funzione valutata vs Inline Table funzione valutata
Inline valori di tabella
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 Table Dichiarazione Valued
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
C'è un vantaggio nell'usare un tipo (in-line o multi statement) sull'altro r? Esistono alcuni scenari in cui uno è migliore dell'altro o le differenze sono puramente sintattiche? Mi rendo conto che le due query di esempio stanno facendo cose diverse ma c'è un motivo per scriverle in quel modo?
Leggere su di loro e i vantaggi/le differenze non sono stati realmente spiegati.
anche uno dei più enorme vantaggio della funzione inline è che si può selezionare ROWID colonne (timestamp), mentre non è possibile inserire i dati TIMESTAMP alla tabella ritorno funzione multistato! – Artru
Grazie per un filo eccellente. Ho imparato molto Tuttavia, una cosa da tenere a mente è quando ALTERe una funzione che è stata ITV su MSTV, il profiler pensa che tu stia modificando un ITV. Qualunque cosa tu faccia per ottenere la sintassi direttamente da un punto di vista MSTV, la ricompilazione fallisce sempre, in genere attorno alla prima istruzione dopo BEGIN. L'unico modo per aggirare questo era DROP la vecchia funzione e CREARE il nuovo come MSTV. – Fandango68