Comment faire son nid CTE correctement

Cette question a été demandé à quelques reprises, mais je n'ai toujours pas réussi à se sortir de la réponse ou de la bonne façon de le faire:

...

;WITH CTE AS
(
  SELECT * FROM ...
)
SELECT *, [dbo].[udf_BetaInv](A, B, C, D) AS 'Loss'
FROM CTE
WHERE (Loss >= @MinRetention)

Cela ne fonctionne pas et je ne peut pas créer la procédure stockée, il est clair que je ne peut pas utiliser la Perte dans le cas OÙ, car il n'existe pas dans ce champ d'application.

Je voudrais utiliser un autre CTE pour conclure un pour que je puisse mettre la OÙ sur l'extérieur, mais ne semble ne pas fonctionner, essayé ceci:

;WITH CTE AS
(
  SELECT * FROM ...
)
SELECT *, [dbo].[udf_BetaInv(A, B, C, D) AS 'Loss'
FROM CTE,
RESULTS AS
(SELECT * FROM CTE)
  SELECT *
  FROM RESULTS
  WHERE (Loss >= @MinRetention)

Mais il ne compile pas en SQL Serveur, j'obtiens un message d'erreur indiquant qu'un " ("égare de nombreuses lignes ci-dessus, mais n'a rien à faire, si je supprime le deuxième CTE il fonctionne très bien.

Je veux seulement éviter la duplication de code, pas envie d'appeler mon [udf_BetaInv] deux fois dans la sélection et aussi dans le où les.

Voulez-vous dire [Loss] (un nom de colonne) pas 'Loss' (une chaîne)? Pas sûr que ce serais la cause de l'erreur, si

OriginalL'auteur Davide Piras | 2011-09-05