查找列依賴關係
回答
嘗試此查詢,它可以把你的一些結果,我認爲你正在尋找。
要過濾,請在c1.name或c2.name列中搜索值。
要查找所有引用某列,使用c2.name對於列名和OBJECT_NAME(k.referenced_object_id)當保持C2列:)
好運表!
select OBJECT_NAME(k.parent_object_id) as parentTable
, c1.name as parentColumn
, OBJECT_NAME(k.referenced_object_id) as referencedTable
, c2.name as referencedColumn
from sys.foreign_keys k
inner join sys.foreign_key_columns f
on f.parent_object_id = k.parent_object_id
and f.constraint_object_id = k.object_id
inner join sys.columns c1
on c1.column_id = f.parent_column_id
and c1.object_id = k.parent_object_id
inner join sys.columns c2
on c2.column_id = f.referenced_column_id
and c2.object_id = k.referenced_object_id
where c2.name = 'Column'
and OBJECT_NAME(k.referenced_object_id) = 'Table'
試試這個:這將提供所有引用你的表的Pk的對象名稱。
select OBJECT_NAME(parent_object_id) from sys.foreign_keys where referenced_object_id = OBJECT_ID('YourTableName')
只需替換{0}和{1}!
declare @tbl_nme as varchar(50)
declare @col_nme as varchar(50)
declare @level int
set @level = 1
set @tbl_nme= '{0}' --TableName
set @col_nme= '{1}' --ColumnName
select
obj.name as obj_nm
, col.name as col_nm
, depobj.name as dep_obj_nm
, CASE depobj.type
WHEN 'C' THEN 'CHECK constraint'
WHEN 'D' THEN 'Default'
WHEN 'F' THEN 'FOREIGN KEY'
WHEN 'FN' THEN 'Scalar function'
WHEN 'IF' THEN 'In-lined table-function'
WHEN 'K' THEN 'PRIMARY KEY'
WHEN 'L' THEN 'Log'
WHEN 'P' THEN 'Stored procedure'
WHEN 'R' THEN 'Rule'
WHEN 'RF' THEN 'Replication filter stored procedure'
WHEN 'S' THEN 'System table'
WHEN 'TF' THEN 'Table function'
WHEN 'TR' THEN 'Trigger'
WHEN 'U' THEN 'User table'
WHEN 'V' THEN 'View'
WHEN 'X' THEN 'Extended stored procedure'
END as dep_obj_type
, null as dep_col_nm
, depobj.type as dep_obj_typeID
, @level as level
into #temp
from sysobjects obj
join syscolumns col on obj.id = col.id
left join (sysdepends dep join sysobjects depobj on depobj.id = dep.id)
on obj.id = dep.depid
and col.colid = dep.depnumber
where obj.name = @tbl_nme
and col.name = @col_nme
while (@@rowcount > 0)
begin
set @level = @level + 1
insert into #temp
select
obj.name as obj_nm
, col.name as col_nm
, depobj.name as dep_obj_nm
, CASE depobj.type
WHEN 'C' THEN 'CHECK constraint'
WHEN 'D' THEN 'Default'
WHEN 'F' THEN 'FOREIGN KEY'
WHEN 'FN' THEN 'Scalar function'
WHEN 'IF' THEN 'In-lined table-function'
WHEN 'K' THEN 'PRIMARY KEY'
WHEN 'L' THEN 'Log'
WHEN 'P' THEN 'Stored procedure'
WHEN 'R' THEN 'Rule'
WHEN 'RF' THEN 'Replication filter stored procedure'
WHEN 'S' THEN 'System table'
WHEN 'TF' THEN 'Table function'
WHEN 'TR' THEN 'Trigger'
WHEN 'U' THEN 'User table'
WHEN 'V' THEN 'View'
WHEN 'X' THEN 'Extended stored procedure'
END as dep_obj_type
, null as dep_col_nm
, depobj.type as dep_obj_typeID
, @level as level
from sysobjects obj
join syscolumns col on obj.id = col.id
left join (sysdepends dep join sysobjects depobj on depobj.id = dep.id)
on obj.id = dep.depid
and col.colid = dep.depnumber
where exists(select 1 from #temp a where obj.name = a.dep_obj_nm and
col.name = a.dep_col_nm and level = @level - 1 and dep_col_nm is not null)
end
select
obj_nm AS 'TABLE',
col_nm AS 'COLUMN',
dep_obj_nm AS 'USAGE_OBJECT',
dep_obj_type AS 'USAGE_OBJECTTYPE',
dep_obj_typeID AS 'USAGE_OBJECTTYPEID'
from #temp
drop table #temp
這就是我之後,謝謝 – 2017-06-20 10:41:30
這應該做的伎倆:
SELECT OBJECT_NAME (referencing_id), referencing_id, referenced_id
FROM sys.sql_expression_dependencies d
WHERE OBJECT_NAME(d.referenced_id) = '<TABLE_NAME>'
AND OBJECT_DEFINITION(referencing_id) = '<COLUMN_NAME>';
來源:http://www.mssqltips.com/sqlservertip/2999/different-ways-to-find-sql-server-object-dependencies/
,或者顯示在表上的所有依賴,使用
EXEC sp_depends <TABLE_NAME>
這應該工作!
-- Search in All Objects
SELECT OBJECT_NAME(OBJECT_ID),definition
FROM sys.sql_modules
WHERE definition LIKE '%' + 'ColumnToBeSearched' + '%'
Order by 1
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 '%' + 'ColumnToBeSearched' + '%'
GO
查找特定列依賴性
SELECT OBJECT_NAME(referencing_id), referenced_database_name, referenced_schema_name, referenced_entity_name FROM sys.sql_expression_dependencies WHERE OBJECT_NAME(referenced_id) = 'table_name' AND OBJECT_DEFINITION(referencing_id) LIKE '%field_name%';
在accepted answer above提供的SQL應包括sys.foreign_keys和sys.foreign_key_columns之間的附加連接條件。見行開頭「和」下面:
from sys.foreign_keys k
inner join sys.foreign_key_columns f
on f.parent_object_id = k.parent_object_id
and f.constraint_object_id = k.object_id
以供參考,在這裏是一個與修訂了整個腳本加入:
select OBJECT_NAME(k.parent_object_id) as parentTable
, c1.name as parentColumn
, OBJECT_NAME(k.referenced_object_id) as referencedTable
, c2.name as referencedColumn
from sys.foreign_keys k
inner join sys.foreign_key_columns f
on f.parent_object_id = k.parent_object_id
and f.constraint_object_id = k.object_id
inner join sys.columns c1
on c1.column_id = f.parent_column_id
and c1.object_id = k.parent_object_id
inner join sys.columns c2
on c2.column_id = f.referenced_column_id
and c2.object_id = k.referenced_object_id
where c2.name = 'GUID'
and OBJECT_NAME(k.referenced_object_id) = 'AuthDomain'
繼續並讓您的答案獨立 - 假設沒有人閱讀接受的答案。 – rrauenza 2016-06-15 17:56:19
@ NoFuchsGavin的劇本通常的偉大工程,但有一定的侷限性,由於與sysdepends
問題(有關這會給出不正確結果的示例,請參見this blog post by Pinal Dave)。
Microsoft還建議您避免在新開發工作中使用sysdepends
。
因此,我們可以使用sys.dm_sql_referencing_entities
和sys.dm_sql_referenced_entities
作爲建議here。
但是我注意到,由於referenced_minor_name
爲NULL,有時會排除列引用。因此,我添加了另一個可能引入誤報的條件,但確保列引用不會從結果集中省略。
DECLARE @SchemaName sysname = '{0}';
DECLARE @TableName sysname = '{1}';
DECLARE @ColumnName sysname = '{2}';
SELECT
@SchemaName + '.' + @TableName AS [USED_OBJECT],
@ColumnName AS [COLUMN],
referencing.referencing_schema_name + '.' + referencing_entity_name AS USAGE_OBJECT,
CASE so.type
WHEN 'C' THEN 'CHECK constraint'
WHEN 'D' THEN 'Default'
WHEN 'F' THEN 'FOREIGN KEY'
WHEN 'FN' THEN 'Scalar function'
WHEN 'IF' THEN 'In-lined table-function'
WHEN 'K' THEN 'PRIMARY KEY'
WHEN 'L' THEN 'Log'
WHEN 'P' THEN 'Stored procedure'
WHEN 'R' THEN 'Rule'
WHEN 'RF' THEN 'Replication filter stored procedure'
WHEN 'S' THEN 'System table'
WHEN 'TF' THEN 'Table function'
WHEN 'TR' THEN 'Trigger'
WHEN 'U' THEN 'User table'
WHEN 'V' THEN 'View'
WHEN 'X' THEN 'Extended stored procedure'
END AS USAGE_OBJECTTYPE,
so.[type] AS USAGE_OBJECTTYPEID
FROM sys.dm_sql_referencing_entities
(
@SchemaName + '.' + @TableName,
'object'
) referencing
INNER JOIN sys.objects so
ON referencing.referencing_id = so.object_id
WHERE
EXISTS
(
SELECT
*
FROM
sys.dm_sql_referenced_entities
(
referencing_schema_name + '.' + referencing_entity_name,
'object'
) referenced
WHERE
referenced_entity_name = @TableName
AND
(
referenced.referenced_minor_name LIKE @ColumnName
-- referenced_minor_name is sometimes NULL
-- therefore add below condition (can introduce False Positives)
OR
(
referenced.referenced_minor_name IS NULL
AND
OBJECT_DEFINITION
(
OBJECT_ID(referencing_schema_name + '.' + referencing_entity_name)
) LIKE '%' + @ColumnName + '%'
)
)
)
ORDER BY
USAGE_OBJECTTYPE,
USAGE_OBJECT
上面的腳本是基於@ NoFuchsGavin的回答和this blog post。
我很想知道是否有人設法找到一種更好的方法,不會引入錯誤的否定或肯定結果。
適合我!感謝您參考最佳做法! – Colin 2017-05-19 01:36:54
- 1. 查找YouTube依賴關係
- 2. 查找dll依賴關係
- 3. 查找AAR依賴關係
- 4. 查找系統的依賴關係
- 5. 查找DISTINCT缺少SQL依賴關係
- 6. 在JAR中查找依賴關係
- 7. 按類名查找pom依賴關係
- 8. 查找所有函數依賴關係
- 9. Maven:查找非託管依賴關係
- 10. 如何找到列的依賴關係
- 11. Maven找出依賴關係
- 12. 控制依賴關係樹邏輯 - 查找循環依賴關係
- 13. 查找Maven依賴項對象的依賴關係
- 14. 查找依賴關係及其依賴項
- 15. 依賴關係的nuget依賴關係
- 16. Clearcase依賴關係列表
- 17. RequireJS依賴關係序列
- 18. 依賴關係
- 19. 查找存儲過程列表的所有依賴關係
- 20. 查找SQL Server 2008計算列依賴關係
- 21. Hudson依賴關係
- 22. tools.jar依賴關係
- 23. URLClassloader依賴關係
- 24. WildFly依賴關係
- 25. flickrj依賴關係
- 26. DLL依賴關係
- 27. Python依賴關係?
- 28. Eclipse:Android依賴關係
- 29. automake依賴關係
- 30. Knockoutjs依賴關係
請注意 - 這是缺少連接條件,請參閱下面從@ christopher-cullum修正的修訂腳本中的修復! – gerrod 2017-12-07 03:36:37
我更改了缺少連接條件的腳本。有趣的是,在更多的5年後,這個腳本仍然使用:) – 2017-12-07 12:30:16
你不知道我昨天發現它有多麼有用! :-) – gerrod 2017-12-07 19:44:24