Belirli bir tabloya atıfta bulunan tüm depolanmış prosedürler nasıl belirlenir


136

Test amaçlı geliştirme ortamı üzerine bir tablo oluşturdum ve bu tabloyu yeniden sunan birkaç sp var. Şimdi bu tabloyu bırakmam ve bu tabloya atıfta bulunan tüm sp'leri tanımlamam gerekiyor. Tüm sp'lerin listesini bulmakta güçlük çekiyorum. Lütfen tablo adının 'x' ve veritabanının sql server 2005 olduğunu varsayarak bir sorgu önerin.




1
uzmanlara: MS olmayan bir SQL sunucusuna ne dersiniz?
Deian

Yanıtlar:


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

BTW - işte bu tür sorular için kullanışlı bir kaynak: SQL Server Sistem Kataloğunu Sorgulama SSS


3
Erişerek üzerinde bunu yapmak için herhangi bir neden var mı ROUTINE_DEFINITIONüzerinde INFORMATION_SCHEMA.ROUTINES?
Marie

1
@Marie - SQL-Server 2005 (AFAIK) buna sahip değil.
Chains

2
Soru, bu çözüm , bir dizenin içinde başvurulduğunda başvurulan nesneleri bulur mu? beğen,set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
Jeff.Clark

1
@ Jeff.Clark - Öğrenmenin kolay bir yolu var :-) - ama evet, doğrudan prosedür metnini arar, böylece onu bulur.
Zincirler

2
evet evet :) Testi ayarlamam biraz zaman alacaktı ve sadece tembel / kolay bir cevap arıyordum :)
Jeff.Clark

27

Aşağıdaki SQL2008 ve üstü üzerinde çalışır. Hem depolanmış prosedürlerin hem de işlevlerin bir listesini sağlar.

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

1
OP'nin SQL-Server-2005 için cevaba ihtiyacı var
Chains

19

Bazen yukarıdaki sorgular doğru sonuç vermez, tablo bağımlılıklarını aşağıdaki gibi almak için bir saklı yordam vardır:

EXEC sp_depends @objname = N'TableName';

1
Benim için bu, tetikleyicileri ve görünümleri gösterdi, ancak saklanan işlemleri göstermedi.
NealWalters

1
NOT: Bunu tablolara erişimim olan bir sistemde çalıştırdım, ancak Stored Procs'ları kullanmadım, bu yüzden tabii ki Stored Procs sonuçta görünmedi.
NealWalters

18

Sorgusuz bir yol, Sql Server Management Studio'yu kullanmak olacaktır.

Tabloyu bulun, sağ tıklayın ve "Bağımlılıkları görüntüle" yi seçin.

DÜZENLE

Ancak yorumcuların dediği gibi, çok güvenilir değil.


4
2005 yılında, nesneler doğru sırada oluşturulmazsa bağımlılık bilgileri güvenilir değildir.
Martin Smith

3
@Martin Smith'in belirttiği gibi, var olmayan bir nesneyi referans alan bir saklı yordam, bir uyarı ile de olsa oluşturulacak, ancak sysdepends'e giriş yapılmayacaktır. Aynısı, yabancı bir veritabanındaki bir tabloya başvuran saklı yordamlar için de geçerlidir: Her iki veritabanında da sysdepends'e hiçbir girdi yerleştirilmez. Diğer bir özellik, bir tabloyu veya görünümü düşürmenin / yeniden oluşturmanın bağımlılık zincirini kırmasıdır. Bu ... err ... özellikleri SQL Server'ın bağımlılık takibini oldukça gereksiz kılar.
Nicholas Carey

7

Aşağıdaki sorgu tüm Depolanan Prosedür adlarını ve bu SP'lerin karşılık gelen tanımlarını alacaktır.

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'

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>%'

Bunun, tablo adının yorumlarda bulunduğu veya tablo adının kullanılan başka bir tablo adının bir alt dizesi olduğu SP'leri de ortaya çıkaracağını unutmayın. Örneğin, "test" ve "test_2" adlı tablolarınız varsa ve "test" ile SP'leri aramaya çalışırsanız, her ikisi için de sonuçlar alırsınız.


2
syscommentsBu şekilde sorgulama , tanımı birden çok satırda 4000 karakter parçasına böldüğünden uzun prosedürler için güvenilir değildir. sys.sql_modulesbundan kaçınır.
Martin Smith

1
İyi bir nokta. Onun sys.sql_modulesyerine kullanmak için güncelledim .
Tom H

3
syscomments, aynı soruya verdiğim düzinelerce
yanıtımın

5

Aşağıdaki sorgu, bir sütundaki bağımlılıkları değil, yalnızca bir tablo üzerindeki bağımlılıkları ararken çalışır:

EXEC sp_depends @objname = N'TableName';

Ancak, her türlü bağımlılığı aramak istiyorsanız, aşağıdaki sorgu en iyi seçenektir, hiçbir şeyi gözden kaçırmaz. Aslında gereğinden fazla bilgi veriyor.

 select distinct
        so.name
        --, text 
  from 
       sysobjects so, 
       syscomments sc 
  where 
     so.id = sc.id 
     and lower(text) like '%organizationtypeid%'
  order by so.name

1
Benim için, SQL Server
12.0'daki

3
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'

GO

Tablo adını belirtmeniz gerekirse bu işe yarar.


3

Yönetim stüdyosunda tabloya sağ tıklayıp 'Bağımlılıkları Görüntüle'ye tıklayabilirsiniz. görüntü açıklamasını buraya girin

tablonuzla bağımlılıkları olan Nesnelerin bir listesini görebileceğinizden daha fazla:görüntü açıklamasını buraya girin


1

Temel olarak 2 seçeneğiniz var:

----Seçenek 1

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

----Seçenek 2

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

Bu 2 sorgu, istediğiniz tabloya atıfta bulunan tüm saklı yordamları size verecektir. Bu sorgu, sysobjects ve syscomments olan 2 sys tablosuna dayanır. Sysobjects, tüm DB nesne adlarınızın depolandığı yerdir, buna saklı yordamlar da dahildir.

Sistem yorumları, tüm prosedürleriniz için metin içerir.

Sorgu yaparsanız: SEÇİN * syscomments

Son sütun olarak saklı yordamlarda yer alan metinle birlikte sysobjects tablosuna eşlenen kimliği içeren bir tablonuz olacak.


0

Bunu dene

   SELECT DISTINCT so.name
    FROM syscomments sc
    INNER JOIN sysobjects so ON sc.id=so.id
    WHERE sc.TEXT LIKE '%your table name%'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.