miércoles, 11 de diciembre de 2013

Refrescando los metadatos de una vista


En esta entrada mostraré un fenómeno que se da cuando no establecemos de forma explícita las columnas que queremos devolver en una vista.

Comenzaremos creando una tabla, metiéndole datos y creando una vista que mostrará el contenido de toda la tabla:
CREATE TABLE Test( Id INT IDENTITY(1, 1), Value VARCHAR(10) ) GO INSERT INTO Test (Value) VALUES ('Valor 1'), ('Valor 2'), ('Valor 3') GO CREATE VIEW vTest AS SELECT * FROM Test GO SELECT * FROM vTest

Veremos que el resultado de la consulta a la vista nos devolverá el contenido completo de la tabla (tal como lo esperábamos):

Ahora vamos a modificar la estructura de nuestra tabla para agregar una columna calculada que muestre la primera letra de la columna Value:
ALTER TABLE Test ADD FirstLetter AS SUBSTRING(Value, 1, 1) PERSISTED

Ahora vamos a ejecutar un query que muestre todo el contenido de la tabla y también que muestre todo el contenido de la vista:

Notemos que la primera sentencia que trabaja sobre la tabla muestra las tres columnas que conforman al objeto, mientras que la segunda sentencia sólo muestra dos columnas, las columnas que existían en la tabla durante el momento de la creación de la vista. ¿Qué es lo que está pasando?, que los metadatos de la vista siguen siendo los mismos, es por ello que aunque cambió la definición de la tabla, la vista sigue utilizando las mismas columnas que antes.

La forma de corregirlo es a través del procedimiento almacenado sp_refreshview:
sp_refreshview 'vTest' GO SELECT * FROM vTest

Notemos que ahora ya se están mostrando las tres columnas que forman parte de la tabla.

Aunque te muestro cómo corregir este problema, no es nada recomendable utilizar un query del tipo SELECT * FROM Table porque se estará ignorando cualquier índice que haya sido creado sobre la tabla para optimizar su lectura.

Espero esta entrada te haya resultado de utilidad, nos vemos la siguiente.

No hay comentarios.:

Publicar un comentario