Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Dapatkan Kolom yang Mendasari Tampilan Berdasarkan Kumpulan Hasil-nya

Salah satu hal hebat tentang tampilan basis data, adalah bahwa mereka memungkinkan Anda menjalankan kueri kompleks tanpa perlu mengetahui skema basis data yang mendasarinya.

Ya, memang benar bahwa Anda perlu mengetahui skema yang mendasarinya saat membuat tampilan, tetapi Anda hanya perlu melakukannya sekali. Setelah Anda membuatnya, Anda dapat menanyakan tampilan itu sepanjang hari tanpa perlu mengingat semua nama tabel dan kolom, dll.

Tampilan biasanya menggabungkan data dari beberapa tabel menjadi satu tabel virtual, yang membuatnya seperti "kotak hitam". Selama ini berfungsi seperti yang dirancang, Anda tidak perlu khawatir dengan detail tersembunyi.

Tetapi bagaimana jika Anda melakukannya ingin memeriksa tampilan untuk tabel dan kolom yang mendasarinya?

Sedangkan sp_help prosedur tersimpan sistem akan memberi Anda informasi tentang kolom yang dikembalikan oleh tampilan, itu tidak memberikan informasi tentang kolom di tabel dasar yang direferensikan dalam tampilan.

Dan ya, ada banyak cara untuk memeriksa definisi tampilan yang sebenarnya. Tetapi jika itu adalah tampilan yang besar, Anda berisiko kehilangan mata, hanya mencoba memilih semua tabel dasar yang sebenarnya terlibat.

Namun, ada metode lain yang dapat Anda gunakan untuk mengembalikan tabel dan kolom dasar yang digunakan oleh tampilan.

Anda dapat menggunakan sys.dm_exec_describe_first_result_set fungsi manajemen dinamis sistem untuk mengembalikan metadata tentang kumpulan hasil saat Anda menanyakan tampilan.

Cara kerjanya adalah, Anda meneruskan kueri T-SQL ke fungsi, dan itu akan mengembalikan metadata tentang kumpulan hasil. Dalam hal ini, kueri yang Anda teruskan ke fungsi akan menjadi kueri yang akan Anda gunakan saat membuat kueri tampilan.

Salah satu manfaat menggunakan metode ini adalah Anda mendapatkan informasi tabel dan kolom dasar dalam daftar yang bagus. Setiap kolom dicantumkan dalam baris terpisah.

Selain itu, Anda dapat mempersempit hasil dengan mempersempit kueri Anda, yang berarti Anda dapat menghilangkan kolom yang tidak relevan (yaitu kolom yang ada dalam tampilan, tetapi tidak relevan untuk kueri spesifik Anda).

Contoh

Berikut ini contoh untuk mendemonstrasikan cara kerjanya.

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

Hasil:

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

Di sini, saya memutuskan untuk menggunakan CONCAT() berfungsi untuk menggabungkan beberapa nama kolom agar lebih mudah untuk memvisualisasikan skema.

Dalam hal ini, Kolom Sumber dan Kolom Tampilan” (yaitu kolom yang dikembalikan oleh tampilan) keduanya memiliki nama yang sama. Ini akan terjadi jika tampilan tidak menggunakan alias untuk kolom.

Perhatikan bahwa alasan kami bisa mendapatkan kolom sumber, tabel, dll, adalah karena kami menggunakan 1 sebagai argumen ketiga. Saat kami menggunakan nilai ini, setiap kueri dianalisis seolah-olah memiliki FOR BROWSE pilihan pada kueri.

Saat Tampilan menggunakan Alias ​​Kolom

Jika tampilan menggunakan alias kolom yang berbeda dengan nama kolom dasar yang sebenarnya, maka itu akan tercermin pada hasil kami.

Dalam contoh ini, kami mengkueri tampilan yang menggunakan alias kolom.

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

Hasil:

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

Jika kita melihat dua baris pertama, kita dapat melihat bahwa kolom yang mendasarinya (dikembalikan oleh source_column kolom), berbeda dengan “View Column” (dikembalikan dengan name kolom).

Kita juga dapat melihat bahwa kolom sumber untuk tampilan ini terletak di server tertaut yang disebut "Homer".

Hal lain yang perlu diperhatikan adalah ketika menggunakan mode jelajah seperti kita di sini (yaitu dengan 1 sebagai argumen ketiga), kami juga mendapatkan kolom lain yang terlibat dalam menyelesaikan kueri (ArtistId , AlbumId , dan GenreId ), meskipun mereka tidak benar-benar dikembalikan dalam kumpulan hasil.

Perbaiki Kueri

Salah satu yang membedakan sys.dm_exec_describe_first_result_set dari prosedur seperti sp_help dan sp_helptext , apakah itu menjelaskan kumpulan hasil bukan pemandangannya.

Hasil yang Anda dapatkan akan bergantung pada kueri aktual yang Anda berikan, bukan hanya tampilan.

Berikut kueri yang sama seperti pada contoh sebelumnya, kecuali kali ini saya memilih hanya satu kolom dari tampilan (daripada menggunakan * wildcard untuk memilih semua kolom).

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

Hasil:

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

Jadi kali ini, hanya empat baris yang dikembalikan, bukan enam.

Dapatkan Kolom Dasar dari Beberapa Tampilan

Seperti disebutkan, sys.dm_exec_describe_first_result_set fungsi menjelaskan seluruh rangkaian hasil, bukan hanya satu tampilan atau objek lain.

Oleh karena itu, Anda dapat menemukan kolom yang mendasari dari beberapa tampilan dan objek sekaligus.

Contoh:

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

Hasil:

+-----------------------+---------------+------------------+--------------------+--------------+-------------+---------+
| 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. Bagaimana Anda bisa mewakili warisan dalam database?

  2. Konversi 'datetimeoffset' menjadi 'waktu' di SQL Server (Contoh T-SQL)

  3. Batasan klausa IN di Sql Server

  4. Perubahan Lisensi Common Sense untuk SQL Server 2014 Standard Edition

  5. Bagaimana cara meminta nilai dan atribut Xml dari tabel di SQL Server?