Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Obtenir des informations sur la vue avec la vue de schéma d'informations VIEWS dans SQL Server

Dans SQL Server, vous pouvez utiliser les VIEWS Transact-SQL vue de schéma d'informations système pour renvoyer des informations sur une ou plusieurs vues de la base de données actuelle. Il renvoie une ligne pour les vues accessibles par l'utilisateur actuel dans la base de données actuelle.

Pour utiliser cette vue, spécifiez le nom complet de INFORMATION_SCHEMA.VIEWS .

Exemple 1 – Renvoyer des informations sur une vue spécifique

Voici un exemple de retour d'informations sur toutes les vues auxquelles l'utilisateur actuel a accès dans la base de données actuelle.

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

Résultat :

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

J'ai intentionnellement omis une colonne dans cet exemple. J'ai omis le VIEW_DEFINITION colonne. Je l'ai laissé de côté car il gâche la sortie lors de l'utilisation de mon outil de ligne de commande. Vous pouvez voir un exemple qui inclut cette colonne ci-dessous.

Notez que la documentation Microsoft avertit que vous ne devez pas utiliser le INFORMATION_SCHEMA vues pour déterminer le schéma d'un objet. Le seul moyen fiable de trouver le schéma d'un objet est d'interroger le sys.objects vue du catalogue.

Exemple 2 – Renvoyer des informations sur une vue spécifique

Voici un exemple de retour d'informations sur une vue spécifique.

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

Résultat :

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

Le revoici avec le VIEW_DEFINITION colonne incluse :

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

Résultat :

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

Exemple 3 – Renvoyer uniquement la définition de la vue

Malgré l'inconvénient de la définition de la vue qui gâche ma mise en page, cette colonne peut être utile si vous recherchez simplement la définition de la vue :

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

Résultat :

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

Exemple 4 - Renvoyer les définitions de vue de plusieurs vues

Le VIEW_DEFINITION peut être très pratique si vous souhaitez répertorier les définitions de vues pour plusieurs vues à la fois :

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

Résultat :

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

Exemple 5 - Renvoyer des définitions de grande vue

Le VIEW_DEFINITION la colonne a une longueur maximale de nvarchar(4000) . Pour les définitions de vue plus grandes que cela, vous pouvez utiliser le OBJECT_DEFINITION() fonction (avec le OBJECT_ID() fonction) pour renvoyer la définition complète.

La valeur de retour de OBJECT_DEFINITION() la fonction est nvarchar(max) , il n'a donc pas la limitation de caractères du VIEW_DEFINITION colonne (qui, comme mentionné, est nvarchar(4000) ).

Exemple :

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

Résultat :

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

Évidemment, cet exemple ne montre pas l'avantage d'utiliser le OBJECT_DEFINITION() fonction, car la définition de vue est trop petite, mais si vous avez une définition de vue extra large, j'espère que cet exemple vous aidera.