Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Ottieni informazioni di visualizzazione con la visualizzazione dello schema di informazioni VIEWS in SQL Server

In SQL Server puoi usare Transact-SQL VIEWS vista dello schema delle informazioni di sistema per restituire informazioni su una o più viste nel database corrente. Restituisce una riga per le viste a cui l'utente corrente può accedere nel database corrente.

Per utilizzare questa vista, specifica il nome completo di INFORMATION_SCHEMA.VIEWS .

Esempio 1 – Informazioni sulla restituzione di una vista specifica

Ecco un esempio di restituzione di informazioni su tutte le viste a cui l'utente corrente ha accesso nel database corrente.

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

Risultato:

+-----------------+----------------+--------------+----------------+----------------+
| 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             |
+-----------------+----------------+--------------+----------------+----------------+

Ho omesso intenzionalmente una colonna in questo esempio. Ho omesso il VIEW_DEFINITION colonna. L'ho lasciato fuori perché incasina l'output quando si utilizza il mio strumento da riga di comando. Puoi vedere un esempio che include questa colonna di seguito.

Tieni presente che la documentazione Microsoft avverte di non utilizzare INFORMATION_SCHEMA viste per determinare lo schema di un oggetto. L'unico modo affidabile per trovare lo schema di un oggetto è interrogare sys.objects vista catalogo.

Esempio 2 – Informazioni sulla restituzione di una vista specifica

Ecco un esempio di restituzione di informazioni su una vista specifica.

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

Risultato:

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

Eccolo di nuovo con il VIEW_DEFINITION colonna inclusa:

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

Risultato:

+-----------------+----------------+--------------+-------------------+----------------+----------------+
| 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             |
+-----------------+----------------+--------------+-------------------+----------------+----------------+

Esempio 3 – Restituisci solo la definizione della vista

Nonostante lo svantaggio della definizione della vista incasina il mio layout, questa colonna può tornare utile se stai solo cercando la definizione della vista:

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

Risultato:

+-------------------+
| 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';                   |
+-------------------+

Esempio 4 – Restituire le definizioni di visualizzazione di più visualizzazioni

Il VIEW_DEFINITION la colonna può essere molto utile se vuoi elencare le definizioni delle viste per più viste contemporaneamente:

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

Risultato:

+-------------------+
| 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)

Esempio 5 – Restituzione di definizioni di visualizzazione ingrandita

Il VIEW_DEFINITION la colonna ha una lunghezza massima di nvarchar(4000) . Per definizioni di viste più grandi di questa, puoi usare OBJECT_DEFINITION() funzione (insieme a OBJECT_ID() funzione) per restituire la definizione completa.

Il valore restituito di OBJECT_DEFINITION() la funzione è nvarchar(max) , quindi non ha il limite di caratteri di VIEW_DEFINITION colonna (che, come accennato, è nvarchar(4000) ).

Esempio:

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

Risultato:

+--------------------+
| (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';                    |
+--------------------+

Ovviamente, questo esempio non mostra il vantaggio dell'utilizzo di OBJECT_DEFINITION() funzione, perché la definizione della vista è troppo piccola, ma se si dispone di una definizione della vista extra grande, si spera che questo esempio aiuti.