2009-12-10 12 views
27

All'interno del mio database piuttosto grande, vorrei scoprire ovunque una colonna sia referenziata all'interno dell'intero schema (SP, funzioni, tabelle, trigger ...). Non voglio fare solo una ricerca di testo poiché questo raccoglierà commenti e troverà anche colonne con nomi simili da altre tabelle.In SQL Server, come posso trovare ovunque un riferimento a una colonna?

Qualcuno sa se/come posso farlo? Io uso SQL Server 2008.

+0

si potrebbe iniziare con sys.columns –

+1

e se permettete SQL dinamica in un proc o direttamente dall'applicazione si stilll non puoi raccogliere tutte le volte che una particolare colonna viene utilizzato. Inoltre, i pacchetti SSIS possono fare riferimento direttamente anche a una colonna. – HLGEM

+0

Controlla qui: http://stackoverflow.com/questions/686247/how-to-find-the-list-of-stored-procedures-which-affect-a-particular-column –

risposta

9

This answer discute anche utilizzando sys.sql_dependencies. Potrebbe anche essere necessario utilizzare sp_refreshsqlmodule come I mention here

8

So che è una vecchia questione, ma mi sono imbattuto in questo Answer e penso che sia l'utile per molti altri.

SELECT 
R.TABLE_NAME,R.COLUMN_NAME 
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE U 
INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS FK 
    ON U.CONSTRAINT_CATALOG = FK.UNIQUE_CONSTRAINT_CATALOG 
    AND U.CONSTRAINT_SCHEMA = FK.UNIQUE_CONSTRAINT_SCHEMA 
    AND U.CONSTRAINT_NAME = FK.UNIQUE_CONSTRAINT_NAME 
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE R 
    ON R.CONSTRAINT_CATALOG = FK.CONSTRAINT_CATALOG 
    AND R.CONSTRAINT_SCHEMA = FK.CONSTRAINT_SCHEMA 
    AND R.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
WHERE U.COLUMN_NAME = 'your column name' 
    AND U.TABLE_NAME = 'your table name' 

P.S. Il colonna dovrebbe essere nella tavolo

0

Come Luv ha detto che questa è una vecchia questione, ma ho trovato altre due soluzioni che possono essere utili.

Sto utilizzando l'oggetto di sistema sys.dm_sql_referenced_entities che trova tutti gli oggetti e le colonne di riferimento in un oggetto specificato. È possibile utilizzare la seguente query:

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 

che dà il seguente risultato:

enter image description here

aspetto negativo di questo oggetto è che avrete bisogno di specificare un oggetto di riferimento.

O fare una ricerca come:

SELECT DISTINCT object_name(id) 
FROM AdventureWorks2012.dbo.syscomments (nolock) 
WHERE text like '%BusinessEntityID%' 

che dà il seguente risultato:

enter image description here

Ho anche trovato il seguente SP che si potrebbe usare in this article, ma rifugio' t testato correttamente:

> 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 

Spero che questo aiuta

1

Tutti i pezzi sono qui, quindi li ho riuniti in un unico pacchetto. Prendi i tavoli dalla risposta di Luv, e il resto da Finding column references in SQL Server. Niente di tutto questo è mio, ti sto solo risparmiando un po 'di "taglia e incolla".

if exists (select * from dbo.sysobjects 
where id = object_id(N'[dbo].[usp_FindColumnUsage]') 
    and OBJECTPROPERTY(id, N'IsProcedure') = 1) 
drop procedure [dbo].[usp_FindColumnUsage] 
go 

create procedure [dbo].[usp_FindColumnUsage] 
@vcTableName varchar(100), 
@vcColumnName varchar(100) 
as 
/************************************************************************************************ 
DESCRIPTION: Creates prinatable report of all stored procedures, views, triggers 
    and user-defined functions that reference the 
    table/column passed into the proc. 

PARAMETERS: 
    @vcTableName - table containing searched column 
    @vcColumnName - column being searched for 
REMARKS: 
    To print the output of this report in Query Analyzer/Management 
    Studio select the execute mode to be file and you will 
    be prompted for a file name to save as. Alternately 
    you can select the execute mode to be text, run the query, set 
    the focus on the results pane and then select File/Save from 
    the menu. 

    This procedure must be installed in the database where it will 
    be run due to it's use of database system tables. 

USAGE: 

    usp_FindColumnUsage 'jct_contract_element_card_sigs', 'contract_element_id' 

AUTHOR: Karen Gayda 

DATE: 07/19/2007 

MODIFICATION HISTORY: 
WHO DATE DESCRIPTION 
--- ---------- ------------------------------------------- 
*************************************************************************************************/ 
set nocount on 

print '' 
print 'REPORT FOR DEPENDENCIES FOR TABLE/COLUMN:' 
print '-----------------------------------------' 
print @vcTableName + '.' [email protected] 

select 
TableName = R.TABLE_NAME, ColumnName = R.COLUMN_NAME 
from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE U 
inner join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS FK 
    on U.CONSTRAINT_CATALOG = FK.UNIQUE_CONSTRAINT_CATALOG 
    and U.CONSTRAINT_SCHEMA = FK.UNIQUE_CONSTRAINT_SCHEMA 
    and U.CONSTRAINT_NAME = FK.UNIQUE_CONSTRAINT_NAME 
inner join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE R 
    on R.CONSTRAINT_CATALOG = FK.CONSTRAINT_CATALOG 
    and R.CONSTRAINT_SCHEMA = FK.CONSTRAINT_SCHEMA 
    and R.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
where U.TABLE_NAME = @vcTableName 
    and U.COLUMN_NAME = @vcColumnName 
order by U.TABLE_NAME, U.COLUMN_NAME 

print '' 
print '' 
print 'STORED PROCEDURES:' 
print '' 

select distinct substring(o.NAME,1,60) as [procedure Name] 
    from sysobjects o 
    inner join syscomments c 
    on o.ID = c.ID 
    where o.XTYPE = 'P' 
    and c.Text like '%' + @vcColumnName + '%' + @vcTableName + '%' 


order by [procedure Name] 
print cast(@@ROWCOUNT as varchar(5)) + ' dependent stored procedures for column "' + @vcTableName + '.' [email protected] + '".' 



print'' 
print'' 
print 'VIEWS:' 
print'' 
select distinct substring(o.NAME,1,60) as [view Name] 
    from sysobjects o 
    inner join syscomments c 
    on o.ID = c.ID 
    where o.XTYPE = 'V' 
    and c.Text like '%' + @vcColumnName + '%' + @vcTableName + '%' 


order by [view Name] 
print cast(@@ROWCOUNT as varchar(5)) + ' dependent views for column "' + @vcTableName + '.' [email protected] + '".' 

print '' 
print '' 
print 'FUNCTIONS:' 
print '' 

select distinct substring(o.NAME,1,60) as [function Name], 
    case when o.XTYPE = 'FN' then 'Scalar' 
    when o.XTYPE = 'IF' then 'Inline' 
    when o.XTYPE = 'TF' then 'Table' 
    else '?' 
    end 
    as [function type] 
    from sysobjects o 
    inner join syscomments c 
    on o.ID = c.ID 
    where o.XTYPE in ('FN','IF','TF') 
    and c.Text like '%' + @vcColumnName + '%' + @vcTableName + '%' 


order by [function Name] 
print cast(@@ROWCOUNT as varchar(5)) + ' dependent functions for column "' + @vcTableName + '.' [email protected] + '".' 

print'' 
print'' 
print 'TRIGGERS:' 
print'' 

select distinct substring(o.NAME,1,60) as [trigger Name] 
    from sysobjects o 
    inner join syscomments c 
    on o.ID = c.ID 
    where o.XTYPE = 'TR' 
    and c.Text like '%' + @vcColumnName + '%' + @vcTableName + '%' 


order by [trigger Name] 
print cast(@@ROWCOUNT as varchar(5)) + ' dependent triggers for column "' + @vcTableName + '.' [email protected] + '".' 

go 

exec usp_FindColumnUsage 'MyTable', 'MyColumn' 
29

Attenzione: Anche se questo è un metodo di ricerca di testo, la sceneggiatura ho intenzione di condividere mi ha salvato un sacco di ore.Cerca all'interno:

  • funzioni scalari
  • funzioni con valori di tabella
  • stored procedure
  • vista
  • innesca

avevo bisogno di specificare regole di confronto per farlo funzionare per me .

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 

L'output è simile al seguente:

Output

Aggiornamento: Se avete bisogno di cercare una certa tabella, SP, ecc è possibile utilizzare una query più specializzato:

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_]'[email protected]_NAME+'.'[email protected]_NAME+'[^a-z_]%' ESCAPE '\' 
     OR '#' + sys.sql_modules.definition + '#' COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%[^a-z_]\['[email protected]_NAME+'\].'[email protected]_NAME+'[^a-z_]%' ESCAPE '\' 
     OR '#' + sys.sql_modules.definition + '#' COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%[^a-z_]'[email protected]_NAME+'.\['[email protected]_NAME+'\][^a-z_]%' ESCAPE '\' 
     OR '#' + sys.sql_modules.definition + '#' COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%[^a-z_]\['[email protected]_NAME+'\].\['[email protected]_NAME+'\][^a-z_]%' ESCAPE '\' 
    ) 
ORDER BY sys.objects.type_desc, sys.schemas.name, sys.objects.name 

PS: entrambe le query eseguono ricerche anche nei commenti.

+2

Così semplice e utile ... Grazie !! –

2

I modi migliori per farlo sono descritti in this article.

Un campione:

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); 
0

Ciao Anche se questo è un vecchio post sono stato in grado di combinare alcuni suggerimenti dall'alto ottenuto qualcosa di simile sotto il quale era piena di aiuto per me. Il motivo per cui ho creato questa è la colonna in cui ero in molti tavoli, quindi non mi ha fornito risultati chiari.

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' 
0

Ho provato questo query e sembra essere fine:

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' 
0

vorrei evitare di usare sys.sql_dependencies perché questa funzionalità verrà rimossa in una versione futura di Microsoft SQL Server. Inoltre non posso utilizzare la funzione OBJECT_DEFINITION perché tutti i miei oggetti sono crittografati. Così mi si avvicinò con la seguente query che sembra abbastanza semplice e funziona per me così bene che ho anche avvolsi alla funzione:

-- ============================================= 
-- 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 
0

Ecco un leggero ritocco sulla @ di alex TV-UDF per includere viste anche:

/* 
    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 
Problemi correlati