2009-12-10 22 views
27

मेरे बजाय बड़े डेटाबेस में, मैं हर जगह एक कॉलम को संपूर्ण स्कीमा (एसपी, फ़ंक्शंस, टेबल, ट्रिगर्स ...) के संदर्भ में संदर्भित करना चाहता हूं। मैं सिर्फ एक टेक्स्ट खोज नहीं करना चाहता क्योंकि यह टिप्पणियां उठाएगा और अन्य तालिकाओं से समान कॉलम भी मिलेगा।SQL सर्वर में, मैं हर जगह एक स्तंभ का संदर्भ कैसे प्राप्त कर सकता हूं?

क्या किसी को पता है कि मैं यह कैसे कर सकता/सकती हूं? मैं SQL सर्वर 2008 का उपयोग करता हूं।

+0

आप SYS.COLUMNS –

+1

के साथ शुरू होता है और अगर आप आवेदन से एक proc में या सीधे गतिशील एसक्यूएल अनुमति देते हैं आप stilll हर समय किसी खास कॉलम प्रयोग किया जाता है लेने के नहीं हो सकता है। इसके अलावा, एसएसआईएस पैकेज सीधे कॉलम का भी संदर्भ दे सकते हैं। – HLGEM

+0

यहां देखें: http://stackoverflow.com/questions/686247/how-to-find-the-list-of-stored-procedures-which-affect-a-particular-column –

उत्तर

9

This answersys.sql_dependencies का उपयोग करने पर भी चर्चा करता है। तुम भी उपयोग करने के लिए sp_refreshsqlmodule रूप I mention here

8

मैं जानता हूँ कि यह एक पुरानी सवाल है आवश्यकता हो सकती है, लेकिन मैं इस Answer जो मुझे लगता है कि कई अन्य लोगों के लिए उपयोगी है भर में आया था।

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' 

पीएसस्तंभतालिका

0

में होना चाहिए जैसा कि लव ने कहा कि यह कोई पुराना सवाल है, लेकिन मैं दो और समाधान है कि सहायक हो सकता है मिल गया है।

मैं sys.dm_sql_referenced_entities सिस्टम ऑब्जेक्ट का उपयोग कर रहा हूं जो किसी निर्दिष्ट ऑब्जेक्ट में सभी संदर्भित ऑब्जेक्ट्स और कॉलम पाता है।

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 

निम्नलिखित में से कौन परिणाम देता है:: आप निम्न क्वेरी का उपयोग कर सकते हैं

enter image description here

इस वस्तु का नकारात्मक पहलू है कि आप एक संदर्भित वस्तु का उल्लेख करना होगा है।

या की तरह कोई खोज करते हैं:

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

निम्नलिखित में से कौन परिणाम देता है:

enter image description here

मैं यह भी पता कर लिया है निम्नलिखित सपा कि आप this article में इस्तेमाल कर सकते हैं, लेकिन हेवन ' टी ने इसे सही ढंग से परीक्षण किया:

> 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 

आशा है कि यह

1

सभी टुकड़े यहां हैं, इसलिए मैंने उन्हें एक पैकेज में एक साथ रखा है। लव के उत्तर से टेबल प्राप्त करें, और शेष Finding column references in SQL Server से प्राप्त करें। इनमें से कोई भी मेरा नहीं है, मैं बस आपको थोड़ा कट-पेस्ट बचा रहा हूं।

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

चेतावनी: हालांकि इस एक पाठ-खोज विधि है, स्क्रिप्ट मैं साझा करने के लिए जा रहा हूँ मुझे बचाया है बहुत सारे और घंटे के बहुत सारे।यह अंदर खोज:

  • अदिश कार्यों
  • तालिका-मान कार्यों
  • संग्रहित प्रक्रियाओं
  • विचारों
  • चलाता है

मैं यह मेरे लिए काम करने के लिए एक मिलान निर्दिष्ट करने के लिए की जरूरत ।

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 

उत्पादन की तरह निम्नलिखित है:

Output

अद्यतन: यदि आप एक और अधिक विशिष्ट क्वेरी इस्तेमाल कर सकते हैं आप एक निश्चित तालिका, सपा, आदि के लिए खोज करने की जरूरत है:

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 

पीएस: दोनों प्रश्न भी टिप्पणियों के भीतर खोज करते हैं।

+2

इतना आसान और उपयोगी ... धन्यवाद !! –

2

इसे करने के सर्वोत्तम तरीके this article में वर्णित हैं।

एक नमूना:

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

हैलो हालांकि यह एक पुराने पोस्ट मैं ऊपर जो नीचे कुछ इस तरह मिल गया से कुछ सुझाव गठबंधन करने में सक्षम था है मेरे लिए पूरी सहायता था। कारण यह मैंने बनाया था कॉलम मैं बहुत सारी टेबल में था इसलिए यह मुझे स्पष्ट आउटपुट प्रदान नहीं करता था।

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

मैं इस क्वेरी की कोशिश की और यह ठीक हो रहा है:

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

मैं sys.sql_dependencies का उपयोग कर, क्योंकि इस सुविधा Microsoft SQL सर्वर के भविष्य के संस्करण में हटा दिया जाएगा से बचने के लिए चाहते हैं। मैं 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 
0

यहाँ @ एलेक्स के टीवी यूडीएफ दृश्य भी शामिल करने के लिए पर एक मामूली ट्वीक है: तो मैं निम्न क्वेरी जो बहुत सरल लगता है और इतनी अच्छी तरह से है कि मैं भी कार्य करने के लिए लपेटा मेरे लिए काम करता के साथ आया था:

/* 
    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 
संबंधित मुद्दे