"Rinfrescare" tutte le Viste di un database
Qualche tempo fa (..2004..) scrissi un post in cui parlavo di un classico fraintedimento legato al funzionamento delle viste di database. Riassumendo, scrivevo che una vista che utilizza la SELECT * non è in grado di riconoscere una modifica intervenuta nella struttura delle tabelle da cui dipende (sia essa l'aggiunta che la eliminazione di colonna).
Nello stesso post proponevo la creazione di una stored procedure che eseguisse la stored di sistema denominata sp_refreshview su tutte le viste di un database facendo uso di un cursore basato sulla sysobjects. Oggi, grazie ancora alla curiosità di un corsista, scopro che:
1) se lanciata su una vista creata WITH SCHEMABINDING la suddetta sp_refreshview restituisce un errore, interrompendo la vecchia "RefreshAllViews" 
2) nei BooksOnLine di SQL 2000 non si fa riferimento a questo fatto, nè il messaggio di errore restituito dal Query Analyzer di SQL 2000 (SP3a) chiarisce il motivo per cui la stored va in errore se si tenta di applicarla a una vista schemabinding. Mentre nei BOL di SQL2005 e dal messaggio di errore restituito di SQL2005 SP2 il fatto è messo chiaramente in evidenza.
3) mi tocca riscrivere la mia sp_RefreshAllView per SQL 2005 anche perchè adesso ci sono di mezzo gli schema di database:
CREATE PROCEDURE RefreshAllView AS
BEGIN
DECLARE views_cursor CURSOR
FOR
SELECT
'[' + S.name + '.' + O.name + ']' As ViewName
FROM
sys.objects O
INNER JOIN sys.schemas S
ON O.schema_id = S.schema_id
WHERE type='V'
OPEN views_cursor
DECLARE @view nvarchar(256)
FETCH NEXT FROM views_cursor INTO @view
WHILE @@FETCH_STATUS = 0
BEGIN
SET @view = N'EXEC SP_REFRESHVIEW ' + @view
BEGIN TRY
EXEC sp_executesql @view
END TRY
BEGIN CATCH
IF ERROR_NUMBER() = 8197
PRINT 'Impossibile eseguire' + @view + ' perchè schemabinding'
END CATCH
FETCH NEXT FROM views_cursor INTO @view
END
CLOSE views_cursor
DEALLOCATE views_cursor
END
GO