Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Obter informações de exibição com a exibição de esquema de informações VIEWS no SQL Server


No SQL Server, você pode usar o Transact-SQL VIEWS visualização do esquema de informações do sistema para retornar informações sobre uma ou mais visualizações no banco de dados atual. Ele retorna uma linha para visualizações que podem ser acessadas pelo usuário atual no banco de dados atual.

Para usar essa visualização, especifique o nome totalmente qualificado de INFORMATION_SCHEMA.VIEWS .


Exemplo 1 – Retornar informações sobre uma visualização específica


Aqui está um exemplo de retorno de informações sobre todas as visualizações às quais o usuário atual tem acesso no banco de dados atual.
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             |
+-----------------+----------------+--------------+----------------+----------------+

Eu omiti intencionalmente uma coluna neste exemplo. Eu omiti o VIEW_DEFINITION coluna. Deixei de fora porque atrapalha a saída ao usar minha ferramenta de linha de comando. Você pode ver um exemplo que inclui essa coluna abaixo.

Observe que a documentação da Microsoft avisa que você não deve usar o INFORMATION_SCHEMA views para determinar o esquema de um objeto. A única maneira confiável de encontrar o esquema de um objeto é consultar o sys.objects visualização do catálogo.

Exemplo 2 – Retornar informações sobre uma visualização específica


Aqui está um exemplo de retorno de informações sobre uma visualização 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             |
+-----------------+----------------+--------------+----------------+----------------+

Aqui está novamente com o VIEW_DEFINITION coluna incluída:
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             |
+-----------------+----------------+--------------+-------------------+----------------+----------------+

Exemplo 3 – Retornar apenas a definição de visualização


Apesar da desvantagem da definição de exibição atrapalhar meu layout, esta coluna pode ser útil se você estiver apenas procurando a definição de exibição:
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';                   |
+-------------------+

Exemplo 4 – Retornar as definições de exibição de várias exibições


O VIEW_DEFINITION column pode ser mais útil se quiser listar as definições de exibição para várias exibições de uma só 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)

Exemplo 5 – Retornando definições de exibição grande


O VIEW_DEFINITION coluna tem um comprimento máximo de nvarchar(4000) . Para definições de visualização maiores que isso, você pode usar o OBJECT_DEFINITION() função (junto com o OBJECT_ID() função) para retornar a definição completa.

O valor de retorno de OBJECT_DEFINITION() função é nvarchar(max) , portanto, não tem a limitação de caracteres do VIEW_DEFINITION coluna (que, como mencionado, é nvarchar(4000) ).

Exemplo:
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 exemplo não mostra o benefício de usar o OBJECT_DEFINITION() função, porque a definição de exibição é muito pequena, mas se você tiver uma definição de exibição extra grande, espero que este exemplo ajude.