Dua jawaban dengan suara terbanyak menggunakan banyak tabel usang yang harus dihindari.
Berikut cara yang lebih bersih untuk melakukannya.
Dapatkan semua tabel tempat prosedur tersimpan bergantung:
SELECT DISTINCT p.name AS proc_name, t.name AS table_name
FROM sys.sql_dependencies d
INNER JOIN sys.procedures p ON p.object_id = d.object_id
INNER JOIN sys.tables t ON t.object_id = d.referenced_major_id
ORDER BY proc_name, table_name
Bekerja dengan MS SQL SERVER 2005+
Daftar Perubahan:
sysdepends
harus diganti dengansys.sql_dependencies
- Tabel baru menggunakan
object_id
bukannyaid
- Tabel baru menggunakan
referenced_major_id
bukannyadepid
- Tabel baru menggunakan
- Menggunakan
sysobjects
harus diganti dengan tampilan katalog sistem yang lebih fokus- Seperti yang ditunjukkan marc_s, sebagai gantinya gunakan
sys.tables
dansys.procedures
- Catatan :Ini mencegah keharusan memeriksa di mana
o.xtype = 'p'
(dll.)
- Seperti yang ditunjukkan marc_s, sebagai gantinya gunakan
-
Juga, sebenarnya tidak perlu CTE yang menggunakan
ROW_NUMBER()
hanya untuk memastikan kami hanya memiliki satu dari setiap kumpulan catatan yang dikembalikan. Itulah yangDISTINCT
ada untuk!- Faktanya, SQL cukup pintar untuk menggunakan DISTINCT di belakang layar.
-
Saya menyerahkan bukti:Exhibit A . Kueri berikut memiliki Rencana Eksekusi yang sama!
-- Complex WITH MyPeople AS ( SELECT id, name, ROW_NUMBER() OVER(PARTITION BY id, name ORDER BY id, name) AS row FROM People) SELECT id, name FROM MyPeople WHERE row = 1 -- Better SELECT DISTINCT id, name FROM People