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