テーブルに予期せず変更された値があります。問題の列はCreatedDate
です。これは、アイテムの作成時に設定されますが、ストアドプロシージャによって変更されています。
テーブルからこの列を参照するすべてのプロシージャ名を取得するために、何らかのタイプのSELECT
ステートメントを作成できますか?
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
特定の列のみを使用してストアドプロシージャを取得する場合は、次のクエリを使用できます。
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%';
ApexSQL Search を使用できます。これは無料のSSMSおよびVisual Studioアドインであり、特定のテーブル列を参照するすべてのオブジェクトを一覧表示できます。また、テーブルやビューに保存されているデータを見つけることもできます。結果を簡単にフィルター処理して、列を参照する特定のデータベースオブジェクトタイプを表示できます。
免責事項:ApexSQLでサポートエンジニアとして働いています
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の名前を表示するだけで、探している場合は、@DisplaySPSource
を0
に設定できます。テーブル/ビュー、ただしSPの場合は、@SearchSP
を0
に設定できます。
結果の例(NorthwindデータベースでCustomerID
を検索、結果はLinqPadを介して表示されます):
注テストビューdbo.TestOrders
でこのスクリプトを確認し、c.*
が使用されていたにもかかわらず、このビューでCustomerID
が見つかったことSELECT
ステートメント(参照テーブルCustomers
にはCustomerID
が含まれているため、ビューにはこの列が表示されます)。
これを試して..
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%CreatedDate%'
GO
または、すべての手順のスクリプトを生成してそこから検索できます。
私は同じ問題を抱えていて、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');
そして、これはViews
とTriggers
の両方で機能します。
以下のクエリを使用して、値を特定できます。ただし、暗号化されたストアドプロシージャの結果は得られないことに注意してください。
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