Comment faire pour utiliser une expression de table commune déclaration d'une fonction table dans SQL Server
Je viens de comprendre que certaines versions de Microsoft OLE DB Provider for SQL Server (surtout sur Windows XP) ne prennent pas en charge WITH
déclaration. Donc, j'ai décidé de passer mon instruction SQL dans un tableau à une fonction, et de l'appeler à partir de mon application. Maintenant, je suis coincé. Comment dois-je utiliser le INSERT INTO
déclaration avec WITH
? Voici le code que j'ai pu venir jusqu'ici, mais SQL Server ne l'aime pas... 🙁
CREATE FUNCTION GetDistributionTable
(
@IntID int,
@TestID int,
@DateFrom datetime,
@DateTo datetime
)
RETURNS
@Table_Var TABLE
(
[Count] int,
Result float
)
AS
BEGIN
INSERT INTO @Table_Var ([Count], Result) WITH T(Result)
AS (SELECT ROUND(Result - AVG(Result) OVER(), 1)
FROM RawResults WHERE IntID = @IntID AND DBTestID = @TestID AND Time >= @DateFrom AND Time <= @DateTo)
SELECT COUNT(*) AS [Count],
Result
FROM T
GROUP BY Result
RETURN
END
GO
Vous devez vous connecter pour publier un commentaire.
Syntaxe de la CTE en fonction à valeur de table serait:
Si possible, vous pouvez aussi omettre le CTE (
WITH
), et au lieu de créer une ligne de table d'une valeur de fonction qui utilise une sous-requête:Votre exemple, semble être l'utilisation d'un multi-déclaration de la fonction TABLE (insert et select), quand vous avez un choix essayez d'utiliser la ligne TVF parce que le multi-déclaration de la fonction TABLE peut empêcher l'optimiseur de requête dans le choix du meilleur plan d'exécution (différence de performances expliqué ici)
;
en face de la partie de la cte.COMME ÇA..
RETURNS TABLE
fonction de celles-ci peuvent être intégrées et donc parfois avoir de bien meilleures performances (voir le lien au bas de Ivan G de réponse). Cependant, comme d'habitude, tout dépend--parfois, mais rarement, il est plus rapide d'utiliser le multi-déclaration de la fonction.