Cara mengidentifikasi semua prosedur tersimpan yang merujuk pada tabel tertentu

136

Saya membuat tabel pada lingkungan pengembangan untuk tujuan pengujian dan ada beberapa sp yang mereferensikan tabel ini. Sekarang saya harus menghapus tabel ini dan juga mengidentifikasi semua sp yang merujuk tabel ini. Saya menghadapi kesulitan untuk menemukan daftar semua sp. Harap sarankan beberapa kueri dengan menganggap bahwa nama tabel adalah 'x' dan database adalah sql server 2005.

DJay
sumber
1
untuk para ahli: bagaimana dengan server SQL non-MS?
Deian

Jawaban:

259
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'

BTW - di sini adalah sumber yang berguna untuk jenis pertanyaan ini: Meminta FAQ Katalog Sistem SQL Server

Rantai
sumber
3
Apakah ada alasan untuk melakukan hal ini selama mengakses ROUTINE_DEFINITIONpada INFORMATION_SCHEMA.ROUTINES?
Marie
1
@Marie - SQL-Server 2005 (AFAIK) tidak memilikinya.
Chains
2
Pertanyaan, apakah solusi ini menemukan objek yang dirujuk ketika mereka direferensikan di dalam sebuah string? seperti,set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
Jeff.Clark
1
@ Jeff.Clark - Ada cara mudah untuk mengetahuinya :-) - tapi ya, itu mencari teks prosedur secara langsung, jadi itu akan menemukannya.
Chains
2
yeah yeah :) Saya perlu waktu untuk menyiapkan tes, dan saya hanya mencari jawaban yang malas / mudah :)
Jeff.Clark
27

Berikut ini berfungsi pada SQL2008 dan di atasnya. Memberikan daftar prosedur dan fungsi yang tersimpan.

select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc
  from sys.objects o inner join sys.sql_expression_dependencies  sd on o.object_id = sd.referenced_id
                inner join sys.objects sp on sd.referencing_id = sp.object_id
                    and sp.type in ('P', 'FN')
  where o.name = 'YourTableName'
  order by sp.Name
Guy Hollington
sumber
1
OP membutuhkan jawaban untuk SQL-Server-2005
Chains
19

kadang-kadang pertanyaan di atas tidak akan memberikan hasil yang benar, ada prosedur tersimpan yang tersedia untuk mendapatkan dependensi tabel sebagai:

EXEC sp_depends @objname = N'TableName';
Pramod Pawar
sumber
1
Bagi saya, ini menunjukkan pemicu & tampilan tetapi tidak menyimpan procs.
NealWalters
1
CATATAN: Saya menjalankan ini pada sistem di mana saya memiliki akses ke tabel, tetapi tidak Stored Procs, jadi tentu saja Stored Procs tidak muncul dalam hasilnya.
NealWalters
18

Cara non-kueri adalah menggunakan Sql Server Management Studio.

Temukan tabel, klik kanan dan pilih "Lihat dependensi".

EDIT

Tapi, seperti kata komentator, itu tidak terlalu bisa diandalkan.

Hans Ke st ing
sumber
4
Pada 2005 informasi dependensi tidak dapat diandalkan jika objek tidak dibuat dalam urutan yang benar.
Martin Smith
3
Seperti yang dicatat oleh @Martin Smith, prosedur tersimpan yang mereferensikan objek yang tidak ada akan dibuat, meskipun dengan peringatan, tetapi entri tidak akan ditempatkan di sysdepends. Juga, hal yang sama berlaku untuk prosedur tersimpan yang merujuk tabel di database asing: Tidak ada entri yang pernah ditempatkan di sysdepends di kedua database. Fitur antoher adalah bahwa menjatuhkan / membuat ulang suatu tabel atau tampilan merusak rantai ketergantungan. Ini ... err ... fitur membuat pelacakan ketergantungan SQL Server cukup berguna.
Nicholas Carey
7

Kueri berikut akan mengambil semua nama Prosedur Tersimpan dan definisi yang sesuai dari SP tersebut

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'
Deepak Kothari
sumber
5
SELECT
    o.name
FROM
    sys.sql_modules sm
INNER JOIN sys.objects o ON
    o.object_id = sm.object_id
WHERE
    sm.definition LIKE '%<table name>%'

Perlu diingat bahwa ini juga akan muncul SPs di mana nama tabel dalam komentar atau di mana nama tabel adalah substring dari nama tabel lain yang sedang digunakan. Misalnya, jika Anda memiliki tabel bernama "test" dan "test_2" dan Anda mencoba mencari SP dengan "test" maka Anda akan mendapatkan hasil untuk keduanya.

Tom H
sumber
2
Permintaan syscommentsdengan cara ini tidak dapat diandalkan untuk prosedur panjang karena membagi definisi menjadi 4000 karakter di beberapa baris. sys.sql_moduleshindari ini.
Martin Smith
1
Poin yang bagus. Saya telah memperbaruinya untuk digunakan sys.sql_modulessebagai gantinya.
Tom H
3
syscomments telah dibantah dalam setiap satu dari selusin jawaban saya untuk pertanyaan yang sama stackoverflow.com/…
gbn
5

Kueri di bawah ini hanya berfungsi saat mencari dependensi pada tabel dan bukan pada kolom:

EXEC sp_depends @objname = N'TableName';

Namun, permintaan berikut adalah pilihan terbaik jika Anda ingin mencari semua jenis dependensi, tidak ketinggalan apa pun. Ini sebenarnya memberikan lebih banyak informasi daripada yang dibutuhkan.

 select distinct
        so.name
        --, text 
  from 
       sysobjects so, 
       syscomments sc 
  where 
     so.id = sc.id 
     and lower(text) like '%organizationtypeid%'
  order by so.name
Siraj Ansari
sumber
1
Bagi saya, tidak mengembalikan apa pun pada SSMS 2014 yang berjalan terhadap database pada SQL Server 12.0)
NealWalters
3
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'

GO

Ini akan berfungsi jika Anda harus menyebutkan nama tabel.

Ric
sumber
3

Di studio manajemen Anda cukup klik kanan ke tabel dan klik ke 'Lihat Dependensi' masukkan deskripsi gambar di sini

daripada Anda dapat melihat daftar Objek yang memiliki dependensi dengan tabel Anda:masukkan deskripsi gambar di sini

nzrytmn
sumber
1

Pada dasarnya Anda memiliki 2 opsi:

----Pilihan 1

SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'

----Pilihan 2

SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'

2 kueri ini akan memberi Anda semua prosedur tersimpan yang merujuk tabel yang Anda inginkan. Permintaan ini bergantung pada tabel 2 sys yang merupakan sysobjects dan syscomments. Sysobjects adalah tempat semua nama objek DB Anda disimpan ini termasuk prosedur yang tersimpan.

Syscomments berisi teks untuk semua prosedur Anda.

Jika Anda kueri: SELECT * FROM syscomments

Anda akan memiliki tabel yang berisi id yang merupakan pemetaan ke tabel sysobjects dengan teks yang terkandung dalam prosedur tersimpan sebagai kolom terakhir.

Alain Ghawi
sumber
0

Coba ini

   SELECT DISTINCT so.name
    FROM syscomments sc
    INNER JOIN sysobjects so ON sc.id=so.id
    WHERE sc.TEXT LIKE '%your table name%'
Pooja Chavan
sumber