Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Вземете основните колони на изглед въз основа на неговия набор от резултати

Едно от страхотните неща за изгледите на база данни е, че те ви позволяват да изпълнявате сложни заявки, без да е необходимо да знаете основната схема на базата данни.

Да, вярно е, че трябва да знаете основната схема, когато създавате изгледа, но трябва да направите това само веднъж. След като го създадете, можете да заявявате този изглед през целия ден, без да е необходимо да помните всички имена на таблици и колони и т.н.

Изгледите обикновено комбинират данни от множество таблици в една, виртуална таблица, което я прави нещо като „черна кутия“. Докато работи, както е проектиран, не е нужно да се занимавате със скритите детайли.

Но какво ще стане, ако направите искате да проверите изглед за основните таблици и колони?

Докато sp_help системната съхранена процедура ще ви предостави информация за колоните, върнати от изгледа, но не предоставя информация за колоните в базовите таблици, които са посочени в изгледа.

И да, има много начини да проверите действителната дефиниция на изгледа. Но ако изгледът е голям, рискувате да се ококорите, просто се опитвайки да изберете всички действителни включени основни таблици.

Има обаче друг метод, който можете да използвате, за да върнете основните таблици и колони, използвани от изглед.

Можете да използвате sys.dm_exec_describe_first_result_set функция за динамично управление на системата за връщане на метаданни за набора от резултати, когато правите заявка към изгледа.

Начинът, по който работи, е, че предавате T-SQL заявка към функцията и тя ще върне метаданни за набора от резултати. В този случай заявката, която предавате на функцията, ще бъде заявката, която бихте използвали, когато задавате заявка за изгледа.

Едно предимство от използването на този метод е, че получавате информацията за основната таблица и колона в хубав списък. Всяка колона е посочена в отделен ред.

Освен това можете да стесните резултатите, като прецизирате заявката си, което означава, че можете да премахнете всички неподходящи колони (т.е. колони, които са в изгледа, но не са подходящи за вашата конкретна заявка).

Пример

Ето пример, за да демонстрирате как работи.

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

Резултат:

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

Тук реших да използвам CONCAT() функция за обединяване на множество имена на колони, за да се улесни визуализирането на схемата.

В този случай колоната източник и колоната на изглед” (т.е. колоната, върната от изгледа) споделят едно и също име. Това ще се случи, ако изгледът не използва псевдоним за колоната.

Имайте предвид, че причината, поради която можем да получим изходните колони, таблици и т.н., е, че използваме 1 като трети аргумент. Когато използваме тази стойност, всяка заявка се анализира така, сякаш има FOR BROWSE опция в заявката.

Когато изгледът използва псевдоними на колони

Ако изгледът използва псевдоними на колони, които са различни от действителните основни имена на колони, това ще бъде отразено на нашите резултати.

В този пример ние правим заявка за изглед, който използва псевдоними на колони.

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

Резултат:

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

Ако погледнем първите два реда, можем да видим, че основните колони (върнати от source_column колони), са различни от „Преглед на колоната“ (връща се от name колона).

Можем също да видим, че изходните колони за този изглед се намират на свързан сървър, наречен „Homer“.

Друго нещо, което трябва да се отбележи е, че когато използвате режим на сърфиране, както ние сме тук (т.е. с 1 като трети аргумент), получаваме и други колони, които участват в завършването на заявката (ArtistId , AlbumId и GenreId ), въпреки че всъщност не са върнати в набора от резултати.

Прецизиране на заявката

Едно от нещата, които отличават sys.dm_exec_describe_first_result_set от процедури като sp_help и sp_helptext , е, че описва набора от резултати не гледката.

Резултатите, които получавате, ще зависят от действителната заявка, която предавате, а не само от изгледа.

Ето същата заявка като в предишния пример, освен че този път избирам само една колона от изгледа (вместо да използвам * заместващ знак, за да изберете всички колони).

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

Резултат:

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

Така че този път се връщат само четири реда вместо шест.

Вземете основните колони от множество изгледи

Както бе споменато, sys.dm_exec_describe_first_result_set функцията описва целия набор от резултати, а не само един изглед или друг обект.

Следователно можете да откриете основните колони от множество изгледи и обекти наведнъж.

Пример:

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

Резултат:

+-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+
| 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Избройте всички колони за идентичност в база данни на SQL Server:sys.identity_columns

  2. Как да добавите ИЛИ пуснете колона от таблица с активиран CDC, без да губите данни в базата данни на SQL Server - урок за SQL Server

  3. Връщане на броя на редовете, засегнати от операторите UPDATE

  4. Нулиране на началната стойност на самоличността след изтриване на записи в SQL Server

  5. CONVERT() от дата/час към примери за низове в SQL Server