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