top of page

Alle SQL-Sichten einer Datenbank aktualisieren / Refresh all SQL views of a database

(alle Versionen/all versions)

Montag, 5. Februar 2024

Deutsch

English

T-SQL Script



Deutsch

Nach Strukturänderungen an SQL-Tabellen sollte man sich angewöhnen, die betreffenden SQL-Sichten zu aktualisieren.

Eine entsprechende Änderung der SQL-Sichten wird nicht automatisch durch den MS SQL-Server durchgeführt bzw. nicht in allen Fällen!

Um Fehler in Programmen/Prozessen zu vermeiden, die auf die SQL-Sichten zugreifen, sollte man die SQL-Sichten daher entweder manuell oder mit dem entsprechenden SQL-Befehl EXEC sp_refreshview aktualisieren.

Um alle SQL-Sichten einer SQL-Datenbank auf einmal zu aktualisieren, kann nachfolgendes SQL-Script nützlich sein.

Siehe T-SQL Script


English

After structural changes to SQL tables, you should get into the habit of updating the relevant SQL views.

A corresponding change in the SQL views is not carried out automatically by the MS SQL server, or not in all cases!

To avoid errors in programs/processes that access the SQL views, you should therefore update the SQL views either manually or with the appropriate SQL command EXEC sp_refreshview.

The following SQL script can be helpful to update all SQL views of an SQL database at once.


T-SQL Script


String concatenate approach , with name filter


DECLARE @ViewNamePart NVARCHAR(100) = 'my part'; // TODO: Filter
DECLARE @SQL NVARCHAR(MAX) = ''; 

SELECT @SQL = @SQL + 'EXEC sp_refreshview ''' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name) + ''';' + CHAR(13)
FROM sys.views
WHERE name LIKE '%' + @ViewNamePart + '%';

PRINT @SQL;

EXEC sp_executesql @SQL;

Cursor approach

DECLARE @sObjName as nvarchar(4000)
DECLARE @sSQL as nvarchar(4000)

DECLARE curSAGTmpRefreshAllViews Cursor FOR 
  select [Name] from dbo.sysobjects where OBJECTPROPERTY(id, N'IsView') = 1

OPEN curSAGTmpRefreshAllViews

IF @@Cursor_Rows<>0
BEGIN  

  DECLARE @lError INT
  DECLARE @sError VARCHAR(4000)

  FETCH NEXT FROM curSAGTmpRefreshAllViews INTO @sObjName

  WHILE (@@FETCH_STATUS = 0)
  BEGIN 

    BEGIN TRY 

      SET @lError = 0
      SET @sError = ''

      SET @sSQL = N'EXEC sp_refreshview ' + '''' + @sObjName + '''';

      EXEC sp_executesql @sSQL

    END TRY      
    BEGIN CATCH

      SET @lError = ERROR_NUMBER()
      SET @sError = ERROR_MESSAGE()
                 
      PRINT 'Fehler/error #' + CAST(@lError as varchar(50)) + ' - View "' + @sObjName + '". ' + @sError

    END CATCH  

    FETCH NEXT FROM curSAGTmpRefreshAllViews INTO @sObjName

  END

END

CLOSE curSAGTmpRefreshAllViews
DEALLOCATE curSAGTmpRefreshAllViews

bottom of page