Saya membuat sebuah tabel pada lingkungan pengembangan untuk tujuan pengujian dan ada beberapa sp's yang refreing tabel ini. Sekarang saya harus drop tabel ini serta mengidentifikasi semua sp's yang mengacu tabel ini. Saya menghadapi kesulitan untuk menemukan daftar semua sp's. Silakan menyarankan beberapa query dengan asumsi bahwa nama tabel adalah 'x' dan database sql server 2005.
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'
BTW -- di sini adalah sumber daya yang berguna untuk jenis pertanyaan: Query SQL Server Sistem Katalog FAQ
Berikut karya-karya di SQL2008 dan di atas. Menyediakan daftar dari kedua disimpan prosedur dan fungsi.
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
kadang-kadang atas pertanyaan tidak akan memberikan hasil yang benar, tidak dibangun dalam prosedur tersimpan yang tersedia untuk mendapatkan meja dependensi sebagai:
EXEC sp_depends @objname = N'TableName';
Query berikut ini akan mengambil semua Prosedur yang Tersimpan nama dan definisi yang sesuai dari orang-SP's
select
so.name,
text
from
sysobjects so,
syscomments sc
where
so.id = sc.id
and UPPER(text) like '%<TABLE NAME>%'
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>%'
Hanya perlu diingat bahwa ini juga akan muncul SPs mana tabel nama di komentar atau di mana nama tabel adalah substring dari nama tabel lain yang sedang digunakan. Misalnya, jika anda memiliki tabel yang bernama "test" dan "test_2" dan anda mencoba untuk mencari SPs dengan "test" kemudian anda'll mendapatkan hasil yang baik.
Query di bawah ini bekerja hanya ketika mencari dependensi pada tabel dan bukan pada kolom:
EXEC sp_depends @objname = N'TableName';
Namun, query berikut adalah pilihan terbaik jika anda ingin mencari segala macam ketergantungan, tidak kehilangan apa pun. Itu benar-benar memberikan informasi lebih dari yang diperlukan.
select distinct
so.name
--, text
from
sysobjects so,
syscomments sc
where
so.id = sc.id
and lower(text) like '%organizationtypeid%'
order by so.name
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'
GO
Ini akan bekerja jika anda harus menyebutkan nama tabel.
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%'
Anda pada dasarnya memiliki 2 pilihan:
----Option 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%'
Ini 2 pertanyaan, dan anda akan mendapatkan semua disimpan prosedur yang merujuk tabel yang anda inginkan. Query ini bergantung pada 2 sys tabel yang sysobjects dan syscomments. Yang sysobjects adalah di mana semua DB nama objek yang disimpan ini mencakup prosedur yang tersimpan.
Yang syscomments berisi teks untuk semua prosedur.
Jika anda query: * PILIH DARI syscomments**
Anda'll memiliki tabel yang berisi id yang merupakan pemetaan untuk meja sysobjects dengan teks yang terkandung dalam prosedur yang tersimpan sebagai kolom terakhir.