Quelques exemples pour montrer, juste Incase:Table multi-statement fonction de valeur vs table en ligne Valued Fonction
Table Inline Valued
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
Tableau multi Déclaration 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
Y a-t-il un avantage à utiliser un type (en ligne ou multi-instructions) par rapport à l'autre r? Y a-t-il des scénarios où l'un est meilleur que l'autre ou les différences sont-elles purement syntaxiques? Je me rends compte que les deux exemples de requêtes font des choses différentes, mais y a-t-il une raison pour que je les écris de cette façon?
La lecture à leur sujet et les avantages/différences n'ont pas vraiment été expliqués.
également l'un des énormes avantages de la fonction en ligne est que vous pouvez sélectionner les colonnes ROWID (TIMESTAMP), alors que vous ne pouvez pas insérer des données TIMESTAMP à la table de retour fonction multistatement! – Artru
Merci pour un excellent fil. J'ai beaucoup appris. Cependant, une chose à garder à l'esprit est quand ALTER une fonction qui était ITV à MSTV, le profileur pense que vous modifiez un ITV. Peu importe ce que vous faites pour obtenir la syntaxe correcte d'un point de vue MSTV, la recompilation échoue toujours, généralement autour de la première instruction après BEGIN. Le seul moyen de contourner cela était de supprimer l'ancienne fonction et de CREER la nouvelle en tant que MSTV. – Fandango68