sql >> Database >  >> RDS >> Sqlserver

De onderliggende kolommen van een weergave verkrijgen op basis van de resultatenset

Een van de geweldige dingen van databaseweergaven is dat u hiermee complexe query's kunt uitvoeren zonder dat u het onderliggende databaseschema hoeft te kennen.

Ja, het is waar dat u het onderliggende schema moet kennen wanneer u de weergave maakt, maar u hoeft dat maar één keer te doen. Als je het eenmaal hebt gemaakt, kun je die weergave de hele dag doorzoeken zonder dat je alle tabel- en kolomnamen, enz. hoeft te onthouden.

Weergaven combineren doorgaans gegevens uit meerdere tabellen in een enkele, virtuele tabel, waardoor het een soort 'zwarte doos' wordt. Zolang het werkt zoals ontworpen, hoeft u zich geen zorgen te maken over de verborgen details.

Maar wat als je doe wil je een weergave controleren op de onderliggende tabellen en kolommen?

Terwijl de sp_help systeem opgeslagen procedure geeft u informatie over de kolommen die door de weergave worden geretourneerd, het geeft geen informatie over de kolommen in de basistabellen waarnaar in de weergave wordt verwezen.

En ja, er zijn veel manieren om de daadwerkelijke definitie van de weergave te controleren. Maar als het een grote weergave is, loop je het risico scheel te gaan kijken en gewoon te proberen alle daadwerkelijke basistabellen eruit te pikken.

Er is echter nog een andere methode die u kunt gebruiken om de basistabellen en kolommen te retourneren die door een weergave worden gebruikt.

U kunt de sys.dm_exec_describe_first_result_set gebruiken dynamische systeembeheerfunctie om metagegevens over de resultatenset te retourneren wanneer u de weergave opvraagt.

De manier waarop het werkt, is dat u een T-SQL-query doorgeeft aan de functie en dat deze metagegevens over de resultatenset retourneert. In dit geval zou de query die u doorgeeft aan de functie de query zijn die u zou gebruiken bij het opvragen van de weergave.

Een voordeel van het gebruik van deze methode is dat u de basistabel- en kolominformatie in een mooie lijst krijgt. Elke kolom wordt in een aparte rij weergegeven.

U kunt de resultaten ook verfijnen door uw zoekopdracht te verfijnen, wat betekent dat u irrelevante kolommen kunt verwijderen (d.w.z. kolommen die in de weergave staan, maar niet relevant zijn voor uw specifieke zoekopdracht).

Voorbeeld

Hier is een voorbeeld om te laten zien hoe het werkt.

SELECT 
    CONCAT(
        source_server + '.', 
        source_database + '.', 
        source_schema + '.', 
        source_table + '.', 
        source_column) AS [Source Column],
    name AS [View Column],
    user_type_name,
    system_type_name,
    max_length,
    [precision],
    scale
FROM sys.dm_exec_describe_first_result_set(
    N'SELECT * FROM vAllCats', 
    NULL, 
    1
);

Resultaat:

+-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+
| Source Column         | View Column   | user_type_name   | system_type_name   | max_length   | precision   | scale   |
|-----------------------+---------------+------------------+--------------------+--------------+-------------+---------|
| Test.dbo.Cats.CatId   | CatId         | NULL             | int                | 4            | 10          | 0       |
| Test.dbo.Cats.CatName | CatName       | NULL             | varchar(60)        | 60           | 0           | 0       |
+-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+

Hier heb ik besloten om de CONCAT() . te gebruiken functie om meerdere kolomnamen samen te voegen om het gemakkelijker te maken om het schema te visualiseren.

In dit geval hebben de bronkolom en de weergavekolom (d.w.z. de kolom die door de weergave wordt geretourneerd) beide dezelfde naam. Dit gebeurt als de weergave geen alias voor de kolom gebruikt.

Merk op dat de reden dat we de bronkolommen, tabellen, enz. kunnen krijgen, is omdat we 1 gebruiken als derde argument. Wanneer we deze waarde gebruiken, wordt elke zoekopdracht geanalyseerd alsof deze een FOR BROWSE . heeft optie op de zoekopdracht.

Als de weergave kolomaliassen gebruikt

Als de weergave kolomaliassen gebruikt die verschillen van de werkelijke onderliggende kolomnamen, wordt dat weergegeven in onze resultaten.

In dit voorbeeld zoeken we een weergave op die kolomaliassen gebruikt.

SELECT 
    CONCAT(
        source_server + '.', 
        source_database + '.', 
        source_schema + '.', 
        source_table + '.', 
        source_column) AS [Source Column],
    name AS [View Column],
    user_type_name,
    system_type_name,
    max_length,
    [precision],
    scale
FROM sys.dm_exec_describe_first_result_set(
    N'SELECT * FROM vAlbums', 
    NULL, 
    1
);

Resultaat:

+------------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+
| Source Column                      | View Column   | user_type_name   | system_type_name   | max_length   | precision   | scale   |
|------------------------------------+---------------+------------------+--------------------+--------------+-------------+---------|
| Homer.Music.dbo.Artists.ArtistName | Artist        | NULL             | nvarchar(255)      | 510          | 0           | 0       |
| Homer.Music.dbo.Albums.AlbumName   | Album         | NULL             | nvarchar(255)      | 510          | 0           | 0       |
| Homer.Music.dbo.Genres.Genre       | Genre         | NULL             | nvarchar(50)       | 100          | 0           | 0       |
| Homer.Music.dbo.Artists.ArtistId   | ArtistId      | NULL             | int                | 4            | 10          | 0       |
| Homer.Music.dbo.Albums.AlbumId     | AlbumId       | NULL             | int                | 4            | 10          | 0       |
| Homer.Music.dbo.Genres.GenreId     | GenreId       | NULL             | int                | 4            | 10          | 0       |
+------------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+

Als we naar de eerste twee rijen kijken, kunnen we zien dat de onderliggende kolommen (geretourneerd door de source_column kolommen), zijn anders dan de "Kolom bekijken" (geretourneerd door de name kolom).

We kunnen ook zien dat de bronkolommen voor deze weergave zich op een gekoppelde server met de naam "Homer" bevinden.

Een ander ding om op te merken is dat bij het gebruik van de bladermodus zoals we hier zijn (d.w.z. met 1 als derde argument), krijgen we ook andere kolommen die betrokken zijn bij het invullen van de query (ArtistId , AlbumId , en GenreId ), ook al worden ze niet daadwerkelijk geretourneerd in de resultatenset.

Verfijn de zoekopdracht

Een van de dingen die sys.dm_exec_describe_first_result_set onderscheidt van procedures zoals sp_help en sp_helptext , is dat het de resultatenset . beschrijft niet het uitzicht.

De resultaten die u krijgt, zijn afhankelijk van de daadwerkelijke zoekopdracht die u doorgeeft, niet alleen van de weergave.

Hier is dezelfde zoekopdracht als in het vorige voorbeeld, behalve dat ik deze keer slechts één kolom uit de weergave selecteer (in plaats van de * jokerteken om alle kolommen te selecteren).

SELECT 
    CONCAT(
        source_server + '.', 
        source_database + '.', 
        source_schema + '.', 
        source_table + '.', 
        source_column) AS [Source Column],
    name AS [View Column],
    user_type_name,
    system_type_name,
    max_length,
    [precision],
    scale
FROM sys.dm_exec_describe_first_result_set(
    N'SELECT Album FROM vAlbums', 
    NULL, 
    1
);

Resultaat:

+----------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+
| Source Column                    | View Column   | user_type_name   | system_type_name   | max_length   | precision   | scale   |
|----------------------------------+---------------+------------------+--------------------+--------------+-------------+---------|
| Homer.Music.dbo.Albums.AlbumName | Album         | NULL             | nvarchar(255)      | 510          | 0           | 0       |
| Homer.Music.dbo.Artists.ArtistId | ArtistId      | NULL             | int                | 4            | 10          | 0       |
| Homer.Music.dbo.Albums.AlbumId   | AlbumId       | NULL             | int                | 4            | 10          | 0       |
| Homer.Music.dbo.Genres.GenreId   | GenreId       | NULL             | int                | 4            | 10          | 0       |
+----------------------------------+---------------+------------------+--------------------+--------------+-------------+---------+

Dus deze keer worden er maar vier rijen geretourneerd in plaats van zes.

De onderliggende kolommen ophalen uit meerdere weergaven

Zoals gezegd, de sys.dm_exec_describe_first_result_set functie beschrijft de hele resultatenset, niet alleen een enkele weergave of ander object.

Daarom kunt u in één keer de onderliggende kolommen van meerdere weergaven en objecten ontdekken.

Voorbeeld:

SELECT 
    CONCAT(
        source_server + '.', 
        source_database + '.', 
        source_schema + '.', 
        source_table + '.', 
        source_column) AS [Source Column],
    name AS [View Column],
    user_type_name,
    system_type_name,
    max_length,
    [precision],
    scale
FROM sys.dm_exec_describe_first_result_set(
    N'SELECT * FROM vAllCats c INNER JOIN vAllDogs d ON c.CatName = d.DogName', 
    NULL, 
    1
);

Resultaat:

+-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+
| Source Column         | View Column   | user_type_name   | system_type_name   | max_length   | precision   | scale   |
|-----------------------+---------------+------------------+--------------------+--------------+-------------+---------|
| Test.dbo.Cats.CatId   | CatId         | NULL             | int                | 4            | 10          | 0       |
| Test.dbo.Cats.CatName | CatName       | NULL             | varchar(60)        | 60           | 0           | 0       |
| Test.dbo.Dogs.DogId   | DogId         | NULL             | int                | 4            | 10          | 0       |
| Test.dbo.Dogs.DogName | DogName       | NULL             | nvarchar(255)      | 510          | 0           | 0       |
| Test.dbo.Dogs.GoodDog | GoodDog       | NULL             | bit                | 1            | 1           | 0       |
+-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+


  1. Hoe SQuirrel SQL Client te installeren

  2. Hoe kan ik twee MySQL-tabellen samenvoegen?

  3. waarde te lang voor type karakter variërend (N)

  4. PgBouncer 1.7 - "Kleuren variëren na opstanding"