Post by juliendevo fare sp_refreshview v_sport
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_sp_ra-rz_7qnr.asp
Esatto, ti stavo preparando la seguente risposta che ormai TI DEVI SORBIRE
LOL
Quando crei una vista, le colonne specificate vengono inserite nella tabella
di sistema syscolumns mentre l'istruzione T-SQL CREATE VIEW... viene
inserita nella tabella syscomments.
Di conseguenza queste informazioni sono statiche, nel senso che non
riflettono le modifiche effettuate sulle tabelle referenziate dalla vista.
Se vuoi aggiornare le viste devi risocostruirle cancellandole e ricreandole
oppure modificandole tramite il comando ALTER VIEW.
In alternativa SQL Server ci offre la stored procedure di sistema
sp_refreshview che "rinfresca" i metadati delle viste.
Prova a dare una occhiata al seguente esempio:
USE tempdb
GO
/* Definisco la tabella dbo.Students */
CREATE TABLE dbo.Students(
StudentID int NOT NULL IDENTITY PRIMARY KEY,
FirstName varchar(10) NOT NULL,
LastName varchar(10) NOT NULL
)
GO
/* La popolo */
SET NOCOUNT ON
INSERT dbo.Students VALUES('Lorenzo', 'Benaglia')
INSERT dbo.Students VALUES('Luca', 'Bianchi')
INSERT dbo.Students VALUES('Andrea', 'Montanari')
INSERT dbo.Students VALUES('Gianluca', 'Hotz')
SET NOCOUNT OFF
GO
/* Definisco la vista dbo.vw_GetStudentsFirstName */
CREATE VIEW dbo.vw_GetStudentsFirstName
AS
SELECT FirstName
FROM dbo.Students
GO
/* Definisco la vista dbo.vw_GetStudents */
CREATE VIEW dbo.vw_GetStudents
AS
SELECT *
FROM dbo.Students
GO
/* Vediamo il data type della colonna FirstName della tabella e delle due
viste */
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = N'FirstName'
AND TABLE_SCHEMA = N'dbo'
AND TABLE_NAME IN(N'Students', N'vw_GetStudentsFirstName',
N'vw_GetStudents')
GO
/* Output:
TABLE_NAME COLUMN_NAME DATA_TYPE
------------------------- ------------ ----------
Students FirstName varchar
vw_GetStudents FirstName varchar
vw_GetStudentsFirstName FirstName varchar
(3 row(s) affected)
*/
/* Modifico il data type della colonna FirstName
** nella tabella dbo.Students
*/
ALTER TABLE dbo.Students
ALTER COLUMN FirstName nvarchar(10) NOT NULL
GO
/* Vediamo il data type della colonna FirstName della tabella e delle due
viste */
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = N'FirstName'
AND TABLE_SCHEMA = N'dbo'
AND TABLE_NAME IN(N'Students', N'vw_GetStudentsFirstName',
N'vw_GetStudents')
GO
/* Output:
TABLE_NAME COLUMN_NAME DATA_TYPE
------------------------- ------------ ----------
Students FirstName nvarchar
vw_GetStudents FirstName varchar
vw_GetStudentsFirstName FirstName varchar
(3 row(s) affected)
*/
/* Come puoi vedere la modifica del data type nella tabella base non è stata
** riflessa nei metadati delle viste.
** OK, diamo loro una bella "rinfrescata" :-D
*/
EXEC sp_refreshview [dbo.vw_GetStudentsFirstName]
EXEC sp_refreshview [dbo.vw_GetStudents]
GO
/* Vediamo il data type della colonna FirstName della tabella e delle due
viste */
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_NAME = N'FirstName'
AND TABLE_SCHEMA = N'dbo'
AND TABLE_NAME IN(N'Students', N'vw_GetStudentsFirstName',
N'vw_GetStudents')
GO
/* Output:
TABLE_NAME COLUMN_NAME DATA_TYPE
------------------------- ------------ ----------
Students FirstName nvarchar
vw_GetStudents FirstName nvarchar
vw_GetStudentsFirstName FirstName nvarchar
(3 row(s) affected)
*/
/* Nel caso in cui le viste da aggiornare siano tante,
** puoi generare i comandi di aggiornamento servendoti
** delle information_schema views
*/
SELECT N'EXEC sp_refreshview [' +
TABLE_SCHEMA + N'.' +
TABLE_NAME + N']' AS RefreshCommand
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = N'VIEW'
AND TABLE_NAME NOT LIKE 'sys%'
GO
/* Output:
RefreshCommand
--------------------------------------------------
EXEC sp_refreshview [dbo.vw_GetStudents]
EXEC sp_refreshview [dbo.vw_GetStudentsFirstName]
(2 row(s) affected)
*/
/* Pulizia */
DROP VIEW dbo.vw_GetStudentsFirstName, dbo.vw_GetStudents
DROP TABLE dbo.Students
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://italy.mvps.org