Comment utiliser les fonctions de table dans SQL Server

J'ai une procédure stockée ici

ALTER PROCEDURE [dbo].[SortedReport] ( @ClientID INT, @RecordLimit, @FromDate DATETIME, @ToDate DATETIME, @OrderBy NVARCHAR(MAX) ) AS BEGIN SELECT TOP (@RecordLimit) sv.ClientID, sv.VendorID, sv.ProductID, sv.TransactionTime, sv.ClientName, sv.VendorName, sv.ProductName, sv.ProductCode, sv.VendorCode, StockCount = dbo.GetStockCount(sv.ProductID, sv.VendorID, @ClientID, @FromDate, @ToDate), TransactionCount = dbo.GetTransCount(sv.ProductID, sv.VendorID, @FromDate, @ToDate), ProductCount = dbo.GetProductCount(sv.ProductID, sv.VendorID), FROM SortedReportiew AS sv WHERE (sv.ClientID = @ClientID) AND (sv.TransactionTime >= @FromDate) AND (sv.TransactionTime < @Date) 

Les appels de fonction dans la partie SELECT sont très inefficaces quand j'ai des données volumineuses. Les appels de fonction pour 100 lignes signifient beaucoup de lectures.

J'ai besoin d'enlever les appels à partir de là et avoir la lecture en bloc dans une fonction de valeur de table et de passer la plupart des parameters de rapport à ces fonctions

 SELECT sd.StockCount, sd.TransactionCount pd.ProductCount, TransactionTime, ClientName, VendorName, ProductName, ProductCode, VendorCode FROM ( SELECT TOP (@RecordLimit) sv.ClientID, sv.VendorID, sv.ProductID, sv.TransactionTime, sv.ClientName, sv.VendorName, sv.ProductName, sv.ProductCode, sv.VendorCode FROM SortedReportiew AS sv --Begin Where { WHERE (ClientID = @ClientID) AND TransactionTime >= @FromDate AND TransactionTime < @ToDate --End Where } ) AS mainQuery FULL JOIN GetStockDetails( @ClientID, @FromDate, @ToDate, ) AS sd ON mainQuery.ClientID = sd.ClientID LEFT OUTER JOIN GetProductDetails( @ProductID @FromDate, @ToDate, ) AS pd ON mainQuery.ClientID = pd.ClientID 

Je n'ai pas essayé la fonction de valeur de table avant. Ce que j'ai écrit jusqu'ici est

 ALTER FUNCTION [dbo].[GetStockDetails] ( @ClientID INT @FromDate DATETIME, @ToDate DATETIME, ) RETURNS @tblStockDetails TABLE ( -- Columns returned by the function StockCount INT, TransactionCount INT ) AS BEGIN INSERT INTO @tblStockDetails SELECT StockCount, TransactionCount FROM ( SELECT StockCount = (SELECT COUNT(*)... // My Query here .... RETURN END 

Quelqu'un peut-il donner des conseils sur le format de la fonction de valeur table pour cette exigence?

Répondez au commentaire ci-dessus.

Eh bien, vous devriez faire en sorte que la table temporaire soit si grande que vous ayez toutes les inputs (lignes) qui ne sont pas des constantes. Et limiter la table avec les constantes ie @fromDate et @toDate

Par exemple:

 dbo.GetStockCount(sv.ProductID, sv.VendorID, @ClientID, @FromDate, @ToDate) 

Cela devrait être fait quelque chose comme ceci:

 INSERT INTO #tempTable SELECT theValuePreviouslyFetchedFromFunction ,ProductID ,VendorID FROM yourTable WHERE clientIDValue = @ClientID AND dateValue <= @fromDate AND dateValue > @toDate 

Et vous définissez la table temporaire avec la key primaire sur productID et vendorID.

Ensuite, vous pouvez join cette table avec l'initiale sur ces deux colonnes et avoir le résultat dans le select.

Sans plus aucun exemple de code, il est difficile de vous aider à regrouper toutes les fonctions en une seule requête.

J'espère que cela t'aides.