sql >> Databáze >  >> RDS >> Sqlserver

Získejte základní sloupce zobrazení na základě sady výsledků

Jednou ze skvělých věcí na databázových pohledech je to, že umožňují spouštět složité dotazy, aniž byste museli znát základní schéma databáze.

Ano, je pravda, že při vytváření pohledu potřebujete znát základní schéma, ale musíte to udělat pouze jednou. Jakmile jej vytvoříte, můžete se na toto zobrazení dotazovat celý den, aniž byste si museli pamatovat všechny názvy tabulek a sloupců atd.

Pohledy obvykle kombinují data z více tabulek do jediné virtuální tabulky, což z ní dělá něco jako „černou skříňku“. Pokud to funguje tak, jak je navrženo, nemusíte se starat o skryté detaily.

Ale co když uděláte chcete v zobrazení zkontrolovat základní tabulky a sloupce?

Zatímco sp_help systémová uložená procedura vám poskytne informace o sloupcích vrácených pohledem, neposkytuje informace o sloupcích v základních tabulkách, na které pohled odkazuje.

A ano, existuje mnoho způsobů, jak zkontrolovat skutečnou definici pohledu. Ale pokud se jedná o velký pohled, riskujete, že budete mrštit očima a budete se snažit vybrat všechny skutečné základní tabulky, které se týkají.

Existuje však další metoda, kterou můžete použít k vrácení základních tabulek a sloupců používaných zobrazením.

Můžete použít sys.dm_exec_describe_first_result_set funkce systémové dynamické správy, která vrátí metadata o sadě výsledků při dotazu na pohled.

Funguje to tak, že funkci předáte dotaz T-SQL a ta vrátí metadata o sadě výsledků. V tomto případě by dotaz, který funkci předáte, byl dotazem, který byste použili při dotazu na zobrazení.

Jednou z výhod použití této metody je, že získáte informace o základní tabulce a sloupcích v pěkném seznamu. Každý sloupec je uveden na samostatném řádku.

Výsledky také můžete zúžit upřesněním dotazu, což znamená, že můžete odstranit všechny irelevantní sloupce (tj. sloupce, které jsou v zobrazení, ale nejsou relevantní pro váš konkrétní dotaz).

Příklad

Zde je příklad demonstrující, jak to funguje.

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

Výsledek:

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

Zde jsem se rozhodl použít CONCAT() funkce pro zřetězení více názvů sloupců, aby bylo snazší vizualizovat schéma.

V tomto případě mají zdrojový sloupec a sloupec zobrazení“ (tj. sloupec vrácený zobrazením) stejný název. K tomu dojde, pokud zobrazení nepoužívá alias pro sloupec.

Všimněte si, že důvod, proč jsme schopni získat zdrojové sloupce, tabulky atd., je ten, že používáme 1 jako třetí argument. Když použijeme tuto hodnotu, každý dotaz je analyzován, jako kdyby měl FOR BROWSE možnost v dotazu.

Když zobrazení používá aliasy sloupců

Pokud zobrazení používá aliasy sloupců, které se liší od skutečných základních názvů sloupců, projeví se to naše výsledky.

V tomto příkladu dotazujeme pohled, který používá aliasy sloupců.

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

Výsledek:

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

Pokud se podíváme na první dva řádky, můžeme vidět, že základní sloupce (vrácené source_column sloupce), se liší od „Zobrazit sloupec“ (vrácený name). sloupec).

Můžeme také vidět, že zdrojové sloupce pro tento pohled jsou umístěny na propojeném serveru s názvem „Homer“.

Další věc, kterou je třeba poznamenat, je, že při použití režimu prohlížení, jako jsme zde (tj. s 1 jako třetí argument), získáme také další sloupce, které se podílejí na dokončení dotazu (ArtistId , AlbumId a GenreId ), i když ve skutečnosti nejsou vráceny v sadě výsledků.

Upřesněte dotaz

Jedna z věcí, která odlišuje sys.dm_exec_describe_first_result_set z procedur jako sp_help a sp_helptext , spočívá v tom, že popisuje množinu výsledků ne pohled.

Výsledky, které získáte, budou záviset na skutečném dotazu, který předáte, nejen na zobrazení.

Zde je stejný dotaz jako v předchozím příkladu, s tím rozdílem, že tentokrát vyberu ze zobrazení pouze jeden sloupec (místo použití * zástupný znak pro výběr všech sloupců).

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

Výsledek:

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

Tentokrát se tedy vrátí pouze čtyři řádky namísto šesti.

Získejte základní sloupce z více zobrazení

Jak již bylo zmíněno, sys.dm_exec_describe_first_result_set Funkce popisuje celou sadu výsledků, nikoli pouze jeden pohled nebo jiný objekt.

Proto můžete objevit základní sloupce z více pohledů a objektů najednou.

Příklad:

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

Výsledek:

+-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+
| 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. Jak NOT REGEXP funguje v MySQL

  2. RoR:Nelze změnit_sloupec v postgresu, v pořádku v MySQL (MySQL pro vývoj, Postgres na Heroku)

  3. Jak funguje operátor LIKE v SQLite

  4. Jak získat včerejší datum v PostgreSQL