web-dev-qa-db-ja.com

あるテーブルの特定の列を参照するすべてのストアドプロシージャを検索する

テーブルに予期せず変更された値があります。問題の列はCreatedDateです。これは、アイテムの作成時に設定されますが、ストアドプロシージャによって変更されています。

テーブルからこの列を参照するすべてのプロシージャ名を取得するために、何らかのタイプのSELECTステートメントを作成できますか?

37
Pomster

1つのオプションは、スクリプトファイルを作成することです。

データベースを右クリック-> Tasks-> Generate Scripts

その後、すべてのストアドプロシージャを選択し、すべてのspsでスクリプトを生成できます。そこから参照を見つけることができます。

または

-- Search in All Objects
SELECT OBJECT_NAME(OBJECT_ID),
definition
FROM sys.sql_modules
WHERE definition LIKE '%' + 'CreatedDate' + '%'
GO

-- Search in Stored Procedure Only
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'CreatedDate' + '%'
GO

ソース SQL SERVER –ストアドプロシージャで使用される列を検索–ストアドプロシージャで列名を検索

52
huMpty duMpty

特定の列のみを使用してストアドプロシージャを取得する場合は、次のクエリを使用できます。

SELECT DISTINCT Name
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%CreatedDate%';

テーブルの特定の列を使用してストアドプロシージャを取得する場合は、以下のクエリを使用できます。

SELECT DISTINCT Name 
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%tbl_name%'
AND OBJECT_DEFINITION(OBJECT_ID) LIKE '%CreatedDate%';
25
Akash KC

ApexSQL Search を使用できます。これは無料のSSMSおよびVisual Studioアドインであり、特定のテーブル列を参照するすべてのオブジェクトを一覧表示できます。また、テーブルやビューに保存されているデータを見つけることもできます。結果を簡単にフィルター処理して、列を参照する特定のデータベースオブジェクトタイプを表示できます。

enter image description here

免責事項:ApexSQLでサポートエンジニアとして働いています

22
Milena Petrovic

information_schemaに含まれるsystem viewsを使用してテーブルで検索views、および(暗号化されていない)ストアドプロシージャと1つのスクリプト。データベースのどこでもフィールド名を検索する必要があるため、このようなスクリプトを少し前に開発しました。

以下のスクリプトは、最初に検索対象の列名を含むテーブル/ビューをリストし、次に列が見つかったストアドプロシージャのソースコードをリストします。 「BASE TABLE」、「VIEW」および「PROCEDURE」、および(オプションで)2番目のテーブルのソースコードを区別する1つのテーブルに結果を表示します。 :

DECLARE @SearchFor nvarchar(max)='%CustomerID%' -- search for this string
DECLARE @SearchSP bit = 1 -- 1=search in SPs as well
DECLARE @DisplaySPSource bit = 1 -- 1=display SP source code

-- tables
if (@SearchSP=1) begin  
  (
  select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object], 
            t.table_type 
  from information_schema.columns c
  left join information_schema.Tables t on c.table_name=t.table_name
  where column_name like @SearchFor 
  union
  select '['+routine_Schema+'].['+routine_Name+']' [schema_object], 
         'PROCEDURE' as table_type from information_schema.routines
  where routine_definition like @SearchFor
        and routine_type='procedure'
  )
  order by table_type, schema_object
end else begin
  select '['+c.table_Schema+'].['+c.table_Name+'].['+c.column_name+']' [schema_object], 
         t.table_type 
  from information_schema.columns c
  left join information_schema.Tables t on c.table_name=t.table_name
  where column_name like @SearchFor 
  order by c.table_Name, c.column_name
end     
-- stored procedure (source listing)
if (@SearchSP=1) begin      
    if (@DisplaySPSource=1) begin
      select '['+routine_Schema+'].['+routine_Name+']' [schema.sp], routine_definition 
      from information_schema.routines
      where routine_definition like @SearchFor
      and routine_type='procedure'
      order by routine_name
    end
end

クエリを実行する場合は、「テキストとしての結果」オプションを使用します。「検索」を使用して、結果セット内の検索テキストを見つけることができます(長いソースコードに役立ちます)。

SPの名前を表示するだけで、探している場合は、@DisplaySPSource0に設定できます。テーブル/ビュー、ただしSPの場合は、@SearchSP0に設定できます。

結果の例(NorthwindデータベースでCustomerIDを検索、結果はLinqPadを介して表示されます):

Sample Result

テストビューdbo.TestOrdersでこのスクリプトを確認し、c.*が使用されていたにもかかわらず、このビューでCustomerIDが見つかったことSELECTステートメント(参照テーブルCustomersにはCustomerIDが含まれているため、ビューにはこの列が表示されます)。

3
Matt

これを試して..

SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%CreatedDate%'
GO

または、すべての手順のスクリプトを生成してそこから検索できます。

1
Nitu Bansal

私は同じ問題を抱えていて、Microsoftにはsystable依存関係 を示します。

SELECT 
    referenced_id
    , referenced_entity_name AS table_name
    , referenced_minor_name as column_name
    , is_all_columns_found
FROM sys.dm_sql_referenced_entities ('dbo.Proc1', 'OBJECT'); 

そして、これはViewsTriggersの両方で機能します。

1
Rafa Barragan

以下のクエリを使用して、値を特定できます。ただし、暗号化されたストアドプロシージャの結果は得られないことに注意してください。

SELECT DISTINCT OBJECT_NAME(comments.id) OBJECT_NAME
    ,objects.type_desc
FROM syscomments comments
    ,sys.objects objects
WHERE comments.id = objects.object_id
    AND TEXT LIKE '%CreatedDate%'
ORDER BY 1
0