テスト目的で開発環境に関するテーブルを作成しましたが、このテーブルを更新しているspはほとんどありません。今度はこの表を参照しているすべてのspを識別するだけでなく、この表を削除する必要があります。私はすべてのspのリストを見つけるのが困難に直面しています。テーブル名を 'x'、データベースをSQL Server 2005と仮定して、いくつかのクエリを提案してください。
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'
ところで - これは、この種の質問に役立つリソースです。SQL Serverシステムカタログの照会FAQ
以下はSQL2008以降で動作します。ストアドプロシージャと関数の両方の一覧を提供します。
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
クエリ以外の方法は、Sql Server Management Studioを使用することです。
テーブルを見つけて右クリックし、[依存関係の表示]を選択します。
EDIT
しかし、コメンターが言ったように、それはあまり信頼できません。
上記のクエリでは正しい結果が得られない場合があります。テーブルの依存関係を取得するために使用可能な組み込みストアドプロシージャがあります。
EXEC sp_depends @objname = N'TableName';
次のクエリは、すべてのストアドプロシージャ名とそれらのSPの対応する定義を取得します。
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>%'
テーブル名がコメント内にある場合、またはテーブル名が使用されている別のテーブル名のサブストリングである場合も、SPが表示されることに注意してください。たとえば、「test」と「test_2」という名前のテーブルがあり、「test」でSPを検索しようとすると、両方の結果が得られます。
以下のクエリは、テーブル上の依存関係を検索するときにのみ機能し、列上の依存関係を検索するときには機能しません。
EXEC sp_depends @objname = N'TableName';
ただし、次のクエリはあらゆる種類の依存関係を検索する場合に最適なオプションです。これを見逃すことはありません。実際には必要以上に多くの情報が得られます。
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
あなたがテーブル名を言及しなければならないならば、これはうまくいくでしょう。
これを試して
SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%your table name%'