sql >> Base de Datos >  >> RDS >> Sqlserver

Obtener información de vista con la vista de esquema de información de VIEWS en SQL Server

En SQL Server, puede usar Transact-SQL VIEWS vista de esquema de información del sistema para devolver información sobre una o más vistas en la base de datos actual. Devuelve una fila para las vistas a las que puede acceder el usuario actual en la base de datos actual.

Para usar esta vista, especifique el nombre completo de INFORMATION_SCHEMA.VIEWS .

Ejemplo 1:devolver información sobre una vista específica

Este es un ejemplo de devolución de información sobre todas las vistas a las que el usuario actual tiene acceso en la base de datos actual.

SELECT 
  TABLE_CATALOG,
  TABLE_SCHEMA,
  TABLE_NAME,
  CHECK_OPTION,
  IS_UPDATABLE
FROM INFORMATION_SCHEMA.VIEWS;

Resultado:

+-----------------+----------------+--------------+----------------+----------------+
| TABLE_CATALOG   | TABLE_SCHEMA   | TABLE_NAME   | CHECK_OPTION   | IS_UPDATABLE   |
|-----------------+----------------+--------------+----------------+----------------|
| Music           | dbo            | RockAlbums   | NONE           | NO             |
| Music           | dbo            | JazzAlbums   | NONE           | NO             |
| Music           | dbo            | BluesAlbums  | NONE           | NO             |
+-----------------+----------------+--------------+----------------+----------------+

Omití intencionalmente una columna en este ejemplo. Omití el VIEW_DEFINITION columna. Lo dejé porque estropea la salida cuando uso mi herramienta de línea de comandos. Puede ver un ejemplo que incluye esta columna a continuación.

Tenga en cuenta que la documentación de Microsoft advierte que no debe usar el INFORMATION_SCHEMA vistas para determinar el esquema de un objeto. La única forma confiable de encontrar el esquema de un objeto es consultar el sys.objects vista de catálogo.

Ejemplo 2:devolver información sobre una vista específica

Este es un ejemplo de devolución de información sobre una vista específica.

SELECT 
  TABLE_CATALOG,
  TABLE_SCHEMA,
  TABLE_NAME,
  CHECK_OPTION,
  IS_UPDATABLE
FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_NAME = 'RockAlbums';

Resultado:

+-----------------+----------------+--------------+----------------+----------------+
| TABLE_CATALOG   | TABLE_SCHEMA   | TABLE_NAME   | CHECK_OPTION   | IS_UPDATABLE   |
|-----------------+----------------+--------------+----------------+----------------|
| Music           | dbo            | RockAlbums   | NONE           | NO             |
+-----------------+----------------+--------------+----------------+----------------+

Aquí está de nuevo con VIEW_DEFINITION columna incluida:

SELECT * 
FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_NAME = 'RockAlbums';

Resultado:

+-----------------+----------------+--------------+-------------------+----------------+----------------+
| TABLE_CATALOG   | TABLE_SCHEMA   | TABLE_NAME   | VIEW_DEFINITION   | CHECK_OPTION   | IS_UPDATABLE   |
|-----------------+----------------+--------------+-------------------+----------------+----------------|
| Music           | dbo            | RockAlbums   | CREATE VIEW RockAlbums 
AS
SELECT AlbumName, ArtistName
FROM Albums
        INNER JOIN Artists
        ON Albums.ArtistId = Artists.ArtistId 
    INNER JOIN Genres
    ON Albums.GenreId = Genres.GenreId
WHERE Genres.Genre = 'Rock';                   | NONE           | NO             |
+-----------------+----------------+--------------+-------------------+----------------+----------------+

Ejemplo 3:devolver solo la definición de vista

A pesar de la desventaja de que la definición de la vista estropea mi diseño, esta columna puede ser útil si solo está buscando la definición de la vista:

SELECT VIEW_DEFINITION 
FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_NAME = 'RockAlbums';

Resultado:

+-------------------+
| VIEW_DEFINITION   |
|-------------------|
| CREATE VIEW RockAlbums 
AS
SELECT AlbumName, ArtistName
FROM Albums
        INNER JOIN Artists
        ON Albums.ArtistId = Artists.ArtistId 
    INNER JOIN Genres
    ON Albums.GenreId = Genres.GenreId
WHERE Genres.Genre = 'Rock';                   |
+-------------------+

Ejemplo 4:devolver las definiciones de vista de varias vistas

El VIEW_DEFINITION La columna puede ser muy útil si desea enumerar las definiciones de vista para varias vistas a la vez:

SELECT VIEW_DEFINITION 
FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_NAME = 'RockAlbums';

Resultado:

+-------------------+
| VIEW_DEFINITION   |
|-------------------|
| CREATE VIEW RockAlbums 
AS
SELECT AlbumName, ArtistName
FROM Albums
        INNER JOIN Artists
        ON Albums.ArtistId = Artists.ArtistId 
    INNER JOIN Genres
    ON Albums.GenreId = Genres.GenreId
WHERE Genres.Genre = 'Rock';                   |
| CREATE VIEW JazzAlbums 
AS
SELECT AlbumName, ArtistName
FROM Albums
        INNER JOIN Artists
        ON Albums.ArtistId = Artists.ArtistId 
    INNER JOIN Genres
    ON Albums.GenreId = Genres.GenreId
WHERE Genres.Genre = 'Jazz';                   |
| CREATE VIEW BluesAlbums 
AS
SELECT AlbumName, ArtistName
FROM Albums
        INNER JOIN Artists
        ON Albums.ArtistId = Artists.ArtistId 
    INNER JOIN Genres
    ON Albums.GenreId = Genres.GenreId
WHERE Genres.Genre = 'Blues';                   |
+-------------------+
(3 rows affected)

Ejemplo 5:devolución de definiciones de vista grande

El VIEW_DEFINITION la columna tiene una longitud máxima de nvarchar(4000) . Para ver definiciones más grandes que esta, puede usar OBJECT_DEFINITION() función (junto con OBJECT_ID() función) para devolver la definición completa.

El valor de retorno de OBJECT_DEFINITION() la función es nvarchar(max) , por lo que no tiene la limitación de caracteres de VIEW_DEFINITION columna (que, como se mencionó, es nvarchar(4000) ).

Ejemplo:

SELECT 
  OBJECT_DEFINITION(OBJECT_ID(TABLE_NAME))
FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_NAME = 'RockAlbums';

Resultado:

+--------------------+
| (No column name)   |
|--------------------|
| CREATE VIEW RockAlbums 
AS
SELECT AlbumName, ArtistName
FROM Albums
        INNER JOIN Artists
        ON Albums.ArtistId = Artists.ArtistId 
    INNER JOIN Genres
    ON Albums.GenreId = Genres.GenreId
WHERE Genres.Genre = 'Rock';                    |
+--------------------+

Obviamente, este ejemplo no muestra el beneficio de usar OBJECT_DEFINITION() función, porque la definición de vista es demasiado pequeña, pero si tiene una definición de vista extra grande, espero que este ejemplo ayude.