OFFICIUM INSERVIO
Your reliable partner for your business software...
Alle SQL-Sichten einer Datenbank aktualisieren / Refresh all SQL views of a database
(alle Versionen/all versions)
Montag, 5. Februar 2024
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