[SQL Server] Supprimer du cache les plans d’exécution d’une requête

/*

Auteur : KHARROUBI Zouhaier

Date Création : 17/12/2013

Objectif : supprimer du cache les plans d'exécution pour une requête donnée

Le but est d'enlever les plans qui sont stockés plusieurs fois

*/

DECLARE @plan_handle VARBINARY(60)=NULL

SELECT TOP 1 @plan_handle=ecp.plan_handle FROM sys.dm_exec_cached_plans ecp

CROSS APPLY sys.dm_exec_sql_text(ecp.plan_handle) sql

WHERE sql.text LIKE 'INSERT INTO #table1 SELECT * FROM OPENQUERY(LIEN_SERVER1,''select pays,magasin,date_vente,montant_vente from vente %'

ORDER BY ecp.bucketid

WHILE @plan_handle IS NOT NULL

BEGIN

    --Supprimer le plan d'execution

      DBCC FREEPROCCACHE(@plan_handle)

      SELECT @plan_handle = NULL

      --Trouver le plan d'execution suivant

        IF EXISTS(SELECT COUNT(sql.text) nbre_plan,ecp.size_in_bytes,sql.text FROM sys.dm_exec_cached_plans ecp

            CROSS APPLY sys.dm_exec_sql_text(ecp.plan_handle) sql

            WHERE sql.text LIKE 'INSERT INTO table1 SELECT * FROM OPENQUERY(LIEN_SERVER1,''select pays,magasin,date_vente, montant_vente from vente %'

            GROUP BY text,size_in_bytes HAVING COUNT(text)>1)

                  BEGIN

                        SELECT TOP 1 @plan_handle=ecp.plan_handle FROM sys.dm_exec_cached_plans ecp

                        CROSS APPLY sys.dm_exec_sql_text(ecp.plan_handle) sql

                        WHERE sql.text LIKE 'INSERT INTO table1 SELECT * FROM OPENQUERY(LIEN_SERVER1,''select pays,magasin,date_vente, montant_vente from vente %'

                        ORDER BY ecp.bucketid

                  END

END