Changements de données dans un CTE après une requête SELECT

J'ai une requête comme celle-ci:

USE [MyDataBase] GO DECLARE @day DATE = '2017-05-18' DECLARE @camp VARCHAR(500) = '9015'; WITH ODCALLS AS (SELECT * FROM [dbo].[ODCalls_2017_05] WHERE CONVERT(DATE, CallLocalTime) = @day AND LastCampaign = @camp AND CallType = 1 ) SELECT COUNT(*) FROM ODCALLS -- this returns 2998 SELECT DATEPART(HOUR, CallLocalTime) AS dHOUR, COUNT(*) AS [Calls Received] FROM ODCALLS GROUP BY DATEPART(HOUR, CallLocalTime) ORDER BY dHOUR -- this returns 24 rows as there are 24 hours in a day SELECT COUNT(*) FROM ODCALLS -- this returns 2907 

L'instance est SQL SERVER EXPRESS 2014 et datatables de la table OdCalls_2017_05 ne changent pas, voici un aperçu des résultats: entrez la description de l'image ici

Je ne sais pas pourquoi cela arrive, quelqu'un a-t-il une explication?

Merci

Je suis surpris que cela fonctionne du tout. Les expressions de table communes n'agissent pas comme des tables temporaires. La requête est utilisée comme input dans la requête suivante (comme une vue peut), et l'optimization peut être effectuée à la fois sur la requête suivante et le CTE, de sorte qu'un jeu de résultats du CTE peut ne jamais exister seul.

Les appels ultérieurs au CTE ne devraient pas fonctionner, car cela viole la définition d'un CTE. Voir https://blogs.sentryone.com/aaronbertrand/backtobasics-ctes/ pour plus d'informations.