2008-09-23 6 views
7

私はテーブルとストアドプロシージャの100の巨大なデータベースを持っています。 SQL Server 2005を使用して、特定のテーブルに対して挿入操作または更新操作を実行するストアドプロシージャの一覧を取得する方法を教えてください。テーブルのストアドプロシージャのリスト

答えて

10
select 
    so.name, 
    sc.text 
from 
    sysobjects so inner join syscomments sc on so.id = sc.id 
where 
    sc.text like '%INSERT INTO xyz%' 
    or sc.text like '%UPDATE xyz%' 

これは(あなたが明らかにスーツにクエリを微調整することができます)あなたの特定のテーブルのためにそれらの中にINSERTまたはUPDATEを持つすべてのストアドプロシージャの内容のリストが表示されます。返されたレコードセットの複数の行にまたがって長い手続きが壊れてしまいますので、結果を手作業で少しずつ調べる必要があります。

を編集する:SP名を返すように調整されたクエリ。また、上記のクエリでは、SPと同様にUDFも返されます。

+0

これは私にSP IDを与えています...私はこのIDでSP名に到達できますか? – Vinodtiru

+0

うん、私はそれを含めるためにクエリを微調整しました。私は今あなたにそれをもらう他のいくつかの答えが掲載されているのを見る。 –

+0

私の答えはこちら:http://stackoverflow.com/questions/119679/list-of-stored-procedure-from-table#119719はほぼ同じです(名前を返します)。しかし、私は答えが –

1

すべてのストアドプロシージャをテキストファイルにエクスポートしてから簡単な検索を実行できます。

より高度な手法は、すべてのSELECT FROMエントリとINSERT FROMエントリを検索するために正規表現検索を使用することです。

0
SELECT Distinct SO.Name 
FROM sysobjects SO (NOLOCK) 
INNER JOIN syscomments SC (NOLOCK) on SO.Id = SC.ID 
AND SO.Type = 'P' 
AND (SC.Text LIKE '%UPDATE%' OR SC.Text LIKE '%INSERT%') 
ORDER BY SO.Name 

This linkをSP検索のリソースとして使用しました。 sp_dependsは

2

使用sys.dm_sql_referencing_entities

注意が廃止されます。

MSDN Reference

1

これは動作するようです:

select
so.name as [proc],
so2.name as [table],
sd.is_updated
from sysobjects so
inner join sys.sql_dependencies sd on so.id = sd.object_id
inner join sysobjects so2 on sd.referenced_major_id = so2.id
where so.xtype = 'p' -- procedure
and is_updated = 1 -- proc updates table, or at least, I think that's what this means

14

sys.sql_dependencies SPROCがクエリに含まれるテーブルや列などの依存関係を持つエンティティのリストを持っています。依存関係を取得するクエリの例については、this postを参照してください。以下のコードスニペットは、ストアドプロシージャによるテーブル/カラムの依存関係のリストを取得します。

select sp.name  as sproc_name 
     ,t.name  as table_name 
     ,c.name  as column_name 
from sys.sql_dependencies d 
join sys.objects t 
    on t.object_id = d.referenced_major_id 
join sys.objects sp 
    on sp.object_id = d.object_id 
join sys.columns c 
    on c.object_id = t.object_id 
    and c.column_id = d.referenced_minor_id 
where sp.type = 'P' 
+0

[MSDN Library](http://msdn.microsoft.com/en-us/library/ms174402.aspx)には、これは廃止予定であるため、sys.sql_expression_dependenciesに置き換える必要があります。残念ながら私は同等の作業をすることはできません。答えに表示されるクエリでは、d.object_idは存在しません。私はd.referencing_idを試しましたが、それもうまくいきませんでした。どのようにsql_expression_dependenciesを使用するか? – Drew

+1

'sys.sql_expression_dependencies'では、' referencing_id'はターゲットを参照する項目、 'referenced_id'は依存関係です。テーブルには、テーブル内の参照されるエンティティのスキーマ名とエンティティ名も含まれます。マイナーIDは列番号を参照し、0は特定の列参照を示さない。 – ConcernedOfTunbridgeWells

+0

私はそれをすべて持っていると思う。問題は、すべてのsql_expression_dependencies行にreferenced_minor_idの0があることです。 sql_dependenciesの類似のクエリでは、ゼロ以外の行が多く返されましたが、結果が異なることに驚いています。私はしばしば特定の列を参照しているsprocsを見たいので、効果的にsql_expression_dependenciesをあまり役に立たないように思えます。 参照のために、私はreferenced_minor_id <> 0の両方からselect count(*)を実行しました。sql_dependenciesに38119行、sql_expression_dependenciesに112行あります。 – Drew

関連する問題