Sql server 在SQL Server中,如何查找引用列的所有位置?
在我相当大的数据库中,我想找出整个模式中引用列的任何地方(SP、函数、表、触发器…)。我不想只进行文本搜索,因为这将获取注释,还将从其他表中查找具有类似名称的列Sql server 在SQL Server中,如何查找引用列的所有位置?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,在我相当大的数据库中,我想找出整个模式中引用列的任何地方(SP、函数、表、触发器…)。我不想只进行文本搜索,因为这将获取注释,还将从其他表中查找具有类似名称的列 有人知道我是否/如何做到这一点吗?我使用SQL Server 2008。正如Luv所说,这是一个老问题,但我还发现了另外两个可能有用的解决方案 我使用的系统对象可以查找指定对象中的所有引用对象和列。您可以使用以下查询: SELECT DISTINCT referenced_schema_name AS SchemaName, ref
有人知道我是否/如何做到这一点吗?我使用SQL Server 2008。正如Luv所说,这是一个老问题,但我还发现了另外两个可能有用的解决方案 我使用的系统对象可以查找指定对象中的所有引用对象和列。您可以使用以下查询:
SELECT DISTINCT
referenced_schema_name AS SchemaName,
referenced_entity_name AS TableName,
referenced_minor_name AS ColumnName
FROM sys.dm_sql_referenced_entities ('yourrefencingobject', 'OBJECT');
GO
结果如下:
这个对象的缺点是需要指定一个引用对象
或者进行如下搜索:
SELECT DISTINCT object_name(id)
FROM AdventureWorks2012.dbo.syscomments (nolock)
WHERE text like '%BusinessEntityID%'
结果如下:
我还发现您可以在中使用以下SP,但尚未对其进行正确测试:
> DECLARE @string varchar(1000), @ShowReferences char(1)
>
> SET @string = 'Person.Person.BusinessEntityID' --> searchstring
>
> SET @ShowReferences = 'N'
> /****************************************************************************/ /*
> */ /* TITLE: sp_FindReferences */ /* */ /* DATE: 18 February, 2004 */ /* */ /* AUTHOR: WILLIAM MCEVOY */ /* */ /****************************************************************************/ /*
> */ /* DESCRIPTION: SEARCH SYSCOMMENTS FOR INPUT STRING, OUTPUT NAME OF OBJECT */ /*
> */ /****************************************************************************/ set nocount on
>
> declare @errnum int ,
> @errors char(1) ,
> @rowcnt int ,
> @output varchar(255)
>
> select @errnum = 0 ,
> @errors = 'N' ,
> @rowcnt = 0 ,
> @output = ''
>
> /****************************************************************************/ /* INPUT DATA VALIDATION
> */ /****************************************************************************/
>
>
> /****************************************************************************/ /* M A I N P R O C E S S I N G
> */ /****************************************************************************/
>
> -- Create temp table to hold results DECLARE @Results table ( Name varchar(55), Type varchar(12), DateCreated datetime,
> ProcLine varchar(4000) )
>
>
> IF (@ShowReferences = 'N') BEGIN insert into @Results select
> distinct
> 'Name' = convert(varchar(55),SO.name),
> 'Type' = SO.type,
> crdate,
> ''
> from sysobjects SO
> join syscomments SC on SC.id = SO.id where SC.text like '%' + @string + '%' union select distinct
> 'Name' = convert(varchar(55),SO.name),
> 'Type' = SO.type,
> crdate,
> ''
> from sysobjects SO where SO.name like '%' + @string + '%' union select distinct
> 'Name' = convert(varchar(55),SO.name),
> 'Type' = SO.type,
> crdate,
> ''
> from sysobjects SO
> join syscolumns SC on SC.id = SO.ID where SC.name like '%' + @string + '%' order by 2,1 END ELSE BEGIN insert into @Results
> select
> 'Name' = convert(varchar(55),SO.name),
> 'Type' = SO.type,
> crdate,
> 'Proc Line' = text
> from sysobjects SO
> join syscomments SC on SC.id = SO.id where SC.text like '%' + @string + '%' union select
> 'Name' = convert(varchar(55),SO.name),
> 'Type' = SO.type,
> crdate,
> 'Proc Line' = ''
> from sysobjects SO where SO.name like '%' + @string + '%' union select
> 'Name' = convert(varchar(55),SO.name),
> 'Type' = SO.type,
> crdate,
> 'Proc Line' = ''
> from sysobjects SO
> join syscolumns SC on SC.id = SO.ID where SC.name like '%' + @string + '%' order by 2,1 END
>
> IF (@ShowReferences = 'N') BEGIN select Name,
> 'Type' = Case (Type)
> when 'P' then 'Procedure'
> when 'TR' then 'Trigger'
> when 'X' then 'Xtended Proc'
> when 'U' then 'Table'
> when 'C' then 'Check Constraint'
> when 'D' then 'Default'
> when 'F' then 'Foreign Key'
> when 'K' then 'Primary Key'
> when 'V' then 'View'
> else Type
> end,
> DateCreated
> from @Results
> order by 2,1 END ELSE BEGIN select Name,
> 'Type' = Case (Type)
> when 'P' then 'Procedure'
> when 'TR' then 'Trigger'
> when 'X' then 'Xtended Proc'
> when 'U' then 'Table'
> when 'C' then 'Check Constraint'
> when 'D' then 'Default'
> when 'F' then 'Foreign Key'
> when 'K' then 'Primary Key'
> when 'V' then 'View'
> else Type
> end,
> DateCreated,
> ProcLine
> from @Results
> order by 2,1 END
希望这有帮助。警告:尽管这是一种文本搜索方法,但我将要共享的脚本为我节省了大量的时间。它在内部搜索:
- 标量函数
- 表值函数
- 存储过程
- 观点
- 触发
SELECT
sys.objects.object_id,
sys.schemas.name AS [Schema],
sys.objects.name AS Object_Name,
sys.objects.type_desc AS [Type]
FROM sys.sql_modules (NOLOCK)
INNER JOIN sys.objects (NOLOCK) ON sys.sql_modules.object_id = sys.objects.object_id
INNER JOIN sys.schemas (NOLOCK) ON sys.objects.schema_id = sys.schemas.schema_id
WHERE
sys.sql_modules.definition COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%{Column Name}%' ESCAPE '\'
ORDER BY sys.objects.type_desc, sys.schemas.name, sys.objects.name
输出如下所示:
declare @obj sysname = 'schema.table';
select p.referencing_entity_name, c.*
from sys.dm_sql_referencing_entities(@obj, 'object') as p
cross apply sys.dm_sql_referenced_entities(
concat(p.referencing_schema_name, '.', p.referencing_entity_name),
'object'
) as c
where c.referenced_id = object_id(@obj)
and referenced_minor_name in ('yourColumn');
更新:如果需要搜索某个表、SP等,可以使用更专门的查询:
DECLARE @SCHEMA_NAME VARCHAR(100) = 'dbo';
DECLARE @OBJECT_NAME VARCHAR(100) = 'MY_OBJECT';
SELECT
sys.objects.object_id,
sys.schemas.name AS [Schema],
sys.objects.name AS Object_Name,
sys.objects.type_desc AS [Type]
FROM sys.sql_modules (NOLOCK)
INNER JOIN sys.objects (NOLOCK) ON sys.sql_modules.object_id = sys.objects.object_id
INNER JOIN sys.schemas (NOLOCK) ON sys.objects.schema_id = sys.schemas.schema_id
WHERE
(
'#' + sys.sql_modules.definition + '#' COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%[^a-z_]'+@SCHEMA_NAME+'.'+@OBJECT_NAME+'[^a-z_]%' ESCAPE '\'
OR '#' + sys.sql_modules.definition + '#' COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%[^a-z_]\['+@SCHEMA_NAME+'\].'+@OBJECT_NAME+'[^a-z_]%' ESCAPE '\'
OR '#' + sys.sql_modules.definition + '#' COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%[^a-z_]'+@SCHEMA_NAME+'.\['+@OBJECT_NAME+'\][^a-z_]%' ESCAPE '\'
OR '#' + sys.sql_modules.definition + '#' COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%[^a-z_]\['+@SCHEMA_NAME+'\].\['+@OBJECT_NAME+'\][^a-z_]%' ESCAPE '\'
)
ORDER BY sys.objects.type_desc, sys.schemas.name, sys.objects.name
p.S.:这两个查询也会搜索内部评论。中介绍了执行此操作的最佳方法 样本:
SELECT OBJECT_NAME (referencing_id),
referenced_database_name,
referenced_schema_name, referenced_entity_name
FROM sys.sql_expression_dependencies d
WHERE OBJECT_NAME(d.referenced_id) = 'TableName'
AND OBJECT_DEFINITION (referencing_id) LIKE '%ColumnName%'
ORDER BY OBJECT_NAME(referencing_id);
您好,虽然这是一篇老帖子,但我还是能够结合上面的一些技巧,得到下面这样的东西,这对我来说很有帮助。我创建这一个的原因是我在很多表中的列,所以它没有为我提供清晰的输出
SELECT
SCHEMA_NAME(schema_id)+'.'+[name] as objectname
,type_desc
,referenced_schema_name AS SchemaName
,referenced_entity_name AS TableName
,referenced_minor_name AS ColumnName
FROM [sys].[all_objects] ob cross apply sys.dm_sql_referenced_entities ( SCHEMA_NAME(schema_id)+'.'+[name], 'OBJECT') e
where is_ms_shipped = 0 and type_desc in ('AGGREGATE_FUNCTION'
,'SQL_SCALAR_FUNCTION'
,'SQL_INLINE_TABLE_VALUED_FUNCTION'
,'SQL_STORED_PROCEDURE'
,'SQL_TABLE_VALUED_FUNCTION'
,'SQL_TRIGGER'
,'VIEW')
and name !='sp_upgraddiagrams'
and referenced_entity_name = 'table name'
and referenced_minor_name = 'columnname'
我尝试了这个查询,结果似乎很好:
select
obj.type REFERENCING_OBJECT_TYPE
,SCHEMA_NAME(obj.schema_id) REFERENCING_OBJECT_SCHEMA
,obj.name REFERENCING_OBJECT_NAME
from sysdepends x
INNER JOIN sys.objects obj ON x.id = obj.object_id
where depid = object_id('yourSchema.yourTable')
and col_name(depid, depnumber) = 'yourColumn'
我希望避免使用sys.sql_依赖项,因为此功能将在Microsoft sql Server的未来版本中删除。 我也不能使用OBJECT_DEFINITION函数,因为我的所有对象都是加密的。 因此,我提出了以下查询,它看起来非常简单,对我来说非常有效,我甚至将其包装到函数中:
-- =============================================
-- Description: Gets all the stored procedures, functions and triggers referencing the specified column.
-- Example: SELECT * FROM dbo.UFN_GET_SP_FN_TR_REFERENCING_COLUMN(N'dbo', N'MY_TABLE', N'MY_COLUMN');
-- =============================================
CREATE FUNCTION dbo.UFN_GET_SP_FN_TR_REFERENCING_COLUMN
(
@SchemaName sysname,
@TableName sysname,
@ColumnName sysname
)
RETURNS TABLE
AS
RETURN
SELECT R.referencing_schema_name + N'.' + R.referencing_entity_name AS referencing_entity_name
FROM sys.dm_sql_referencing_entities(@SchemaName + N'.' + @TableName, 'OBJECT') AS R
INNER JOIN sys.objects AS O
ON R.referencing_id = O.object_id
WHERE O.[type] IN ('FN'/*SQL scalar function*/, 'IF'/*SQL inline table-valued function*/, 'TF'/*SQL table-valued-function*/, 'P'/*SQL Stored Procedure*/, 'TR' /*SQL DML trigger*/)
AND EXISTS(SELECT 1 FROM sys.dm_sql_referenced_entities (R.referencing_schema_name + N'.' + R.referencing_entity_name, 'OBJECT') AS RE WHERE RE.referenced_entity_name = @TableName AND RE.referenced_minor_name = @ColumnName);
GO
这里对@alex的TV-UDF做了一个小小的调整,将视图也包括在内:
/*
Source: https://stackoverflow.com/a/47775531/852956
Gets all the stored procedures, functions and triggers referencing the specified column.
SELECT * FROM Utility.ft_SelectSprocFuncAndTrigrRefs(N'BrakeRotor', N'BrakeRotors', N'BrakeRotorNumber');
*/
CREATE FUNCTION Utility.ft_SelectSprocFuncAndTrigrRefs
(
@SchemaName sysname,
@TableName sysname,
@ColumnName sysname
)
RETURNS TABLE
AS
RETURN
SELECT QUOTENAME(R.referencing_schema_name) + N'.' + QUOTENAME(R.referencing_entity_name) AS ReferencingEntityName
FROM sys.dm_sql_referencing_entities(@SchemaName + N'.' + @TableName, 'OBJECT') AS R
INNER JOIN sys.objects AS O
ON R.referencing_id = O.object_id
WHERE O.[type] IN (
'FN'/*SQL scalar function*/,
'IF'/*SQL inline table-valued function*/,
'TF'/*SQL table-valued-function*/,
'P'/*SQL Stored Procedure*/,
'TR' /*SQL DML trigger*/
)
AND EXISTS(
SELECT 1
FROM sys.dm_sql_referenced_entities (R.referencing_schema_name + N'.' + R.referencing_entity_name, 'OBJECT') AS RE
WHERE RE.referenced_entity_name = @TableName AND RE.referenced_minor_name = @ColumnName)
UNION SELECT QUOTENAME(VIEW_SCHEMA) + N'.' + QUOTENAME(VIEW_NAME) AS ReferencingEntityName
FROM INFORMATION_SCHEMA.VIEW_COLUMN_USAGE
WHERE TABLE_SCHEMA = @SchemaName
AND TABLE_NAME = @TableName
AND column_name = @ColumnName
GO
我们今天必须这样做,并得出以下结论:
declare @obj sysname = 'schema.table';
select p.referencing_entity_name, c.*
from sys.dm_sql_referencing_entities(@obj, 'object') as p
cross apply sys.dm_sql_referenced_entities(
concat(p.referencing_schema_name, '.', p.referencing_entity_name),
'object'
) as c
where c.referenced_id = object_id(@obj)
and referenced_minor_name in ('yourColumn');
检查这里:如果您允许在进程中使用动态sql,或者直接从应用程序中使用动态sql,那么在使用特定列的所有时候,您仍然可能无法获取动态sql。此外,SSIS包也可能直接引用一个列。我想知道到底是谁认为存储过程列表是对OPS问题的回答???完全不同的问题,寻找完全不同的东西!如此简单和有用。。。谢谢那么引用该列的表呢?例如外键?