2010-03-22 6 views
2

Aujourd'hui je dirige cetteComment créer une procédure stockée qui appelle sp_refreshview pour chaque vue de la base de données?

select 'exec sp_refreshview N''['+table_schema+'].['+table_name+']''' 
from information_schema.tables 
where table_type = 'view' 

Cela génère beaucoup de: '[SCHEMA] [TABLEAU]' exec sp_refreshview N. Je copie ensuite le résultat dans la fenêtre de l'éditeur de requête et exécute tous ces execs.

Comment faire cela en même temps? Je voudrais avoir une procédure stockée appelée quelque chose comme dev.RefreshAllViews que je peux exécuter pour ce faire ...

Répondre

10
DECLARE @RefreshScript varchar(max) 
set @RefreshScript = '' 


select @RefreshScript= @RefreshScript + 'exec sp_refreshview N''['+table_schema+'].['+table_name+']'' 
' 
from information_schema.tables 
where table_type = 'view' 



exec (@RefreshScript) 

S'il y a un risque que vos vues aient les caractères [] dans leurs noms, vous pouvez regarder la fonction QUOTENAME.

Ou aussi avec un curseur

DECLARE @viewName AS VARCHAR(255) 

    DECLARE listOfViews CURSOR 
     FOR SELECT '[' + SCHEMA_NAME(uid) + '].[' + name + ']' 
      FROM sysobjects 
      WHERE xtype = 'V' 


    OPEN listOfViews 

    FETCH NEXT FROM listOfViews INTO @viewName 

    WHILE (@@FETCH_STATUS <> -1) 
     BEGIN 


      FETCH NEXT FROM listOfViews INTO @viewName 

      BEGIN TRY 
       EXEC sp_refreshview @viewName 
       PRINT @viewName + ' refreshed OK' 
      END TRY 
      BEGIN CATCH 
       PRINT @viewName + ' refresh failed' 
      END CATCH 
     END 

    CLOSE listOfViews 

    DEALLOCATE listOfViews 
+0

J'ai aimé le premier qui était très simple – Allrameest

+0

:) ne sera pas la version du curseur ignorer le traitement de la première vue? il est allé chercher en dehors de la boucle, puis à nouveau en haut de la boucle –

0

Vérifiez la procédure système SP_ExecuteSQL, qui accepte une chaîne et l'exécute.

Vous pouvez écrire une procédure stockée qui ouvre un curseur sur la requête ci-dessus, génère les chaînes appropriées et les exécute.

0
DECLARE @Sql VARCHAR(MAX) = '' 

SELECT @Sql += 'EXEC sys.sp_refreshview @viewname = N''' + QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) + '''' + CHAR(10) 
FROM INFORMATION_SCHEMA.VIEWS 

PRINT @Sql 
EXEC(@Sql) 
Questions connexes