2010-09-09 95 views
17

我試圖找到對SQL Server數據庫中的對象的所有引用。查找對SQL Server數據庫中的對象的所有引用

我該如何快速搜索? SQL Server Management Studio似乎沒有這樣做。我使用http://www.red-gate.com/products/SQL_Search/,但我想找到「官方」微軟解決方案。它是否在另一個產品?

例如,當我在Visual Studio中進行大量搜索時,我希望能夠在所有存儲過程中找到某種東西。

或者我沒有用正確的方式編碼?

卡爾

回答

0

我不知道的「微軟官方」的方式,但我已經在過去使用SqlDigger。不算太差。

如果你想在VS中做到這一點,那麼你將需要包含在你的項目中的所有過程的文本。

+0

此鏈接已經死了。很多地方提供了這個工具的下載,但我沒有看到官方的。我通常只使用RedGate的免費SQL搜索插件(http://www.red-gate.com/products/sql-development/sql-search/)。 – Brian 2014-09-04 19:26:25

1

我使用這個查詢來尋找在存儲過程中的所有表(或文字):

SELECT DISTINCT o.name, o.xtype 
FROM syscomments c 
INNER JOIN sysobjects o ON c.id=o.id 
WHERE c.TEXT LIKE '%tablename%' 
+2

請看我的答案,爲什麼你應該檢查'SYS.SQL_MODULES'來代替。 – 2010-09-09 23:31:04

37

用途:

select object_name(m.object_id), m.* 
    from sys.sql_modules m 
where m.definition like N'%name_of_object%' 

...因爲SYSCOMMENTSINFORMATION_SCHEMA.routines具有爲nvarchar(4000)列。所以如果在位置3998使用「name_of_object」,它將不會被找到。 SYSCOMMENTS確實有多行,但是截斷了INFORMATION_SCHEMA.routines

+1

謝謝...雖然我希望你幾周前能告訴我這個! – Martin 2010-09-09 23:34:59

+0

@MArtin問題只在20小時前提出... – 2010-09-10 20:03:53

+0

sys.sql_modules在SQL Server 2000中不可用。 – DeanOC 2012-10-14 21:40:23

-2

在SQL 2000中,這裏是一個查詢,它可以在對象定義中進行搜索,支持多達2000個字符的搜索字符串。它使用syscomments表中的塊。

SELECT O.name, O.xtype 
FROM sysobjects O 
WHERE EXISTS (
    SELECT * 
    FROM 
     (
     SELECT 
      Chunk = Substring(C1.text, T.Offset, 4000) 
       + Coalesce(Substring(C2.text, 1, T.AdditionalLength), '') 
     FROM 
      syscomments C1 
      CROSS JOIN (
       SELECT 1, 0 
       UNION ALL 
       SELECT 2001, 2000 
      ) T (Offset, AdditionalLength) 
      LEFT JOIN syscomments C2 
       ON C1.id = C2.id 
       AND C1.colid + 1 = C2.colid 
       AND T.Offset > 1 
     WHERE 
      O.id = C1.id 
    ) C 
    WHERE 
     Chunk LIKE '%search string%' 
); 
+0

有什麼不喜歡這個答案!?!?! – ErikE 2016-11-25 03:07:32

0

當您在對象資源管理器中右鍵單擊某個對象時,SQL Server Management Studio具有視圖依賴關係功能。這是你在找什麼?

+0

查看依賴關係不會告訴你對象的位置,例如。一個表或視圖,在動態SQL中被引用。 OMG Ponies提供的查詢將會。 – DeanOC 2012-01-31 04:08:54

1

如果您想要使用OMG Ponies sql作爲SSMS中的鍵盤快捷鍵,請將以下SP添加到主數據庫中。

USE [master] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE [dbo].[SP_FindAllReferences] 
@targetText nvarchar(128) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    declare @origdb nvarchar(128) 
    select @origdb = db_name() 

    declare @sql nvarchar(1000) 

    set @sql = 'USE [' + @origdb +'];' 
    set @sql += 'select object_name(m.object_id), m.* ' 
    set @sql += 'from sys.sql_modules m where m.definition like N' + CHAR(39) + '%' + @targetText + '%' + CHAR(39) 

    exec (@sql) 

    SET NOCOUNT OFF; 
END 

然後你只需要dbo.SP_FindAllReferences添加到您的鍵盤快捷方式,然後你可以在任何數據庫的服務器上的上下文中使用它。

乾杯!

注:如果您使用的是SQL Server 2005中,你將不得不更換

@sql += 

@sql = @sql + 
1

通過使用無證SQL SP的:sp_msforeachdb

exec sp_msforeachdb ' 
USE [?]; 

--IF DB_NAME() NOT IN (''master'',''tempdb'',''model'',''msdb'') 
BEGIN 
DECLARE 
    @SearchStr varchar(100) 
    SET @SearchStr = ''%column_store_segments%''; 
SELECT DISTINCT 
    ''?'' as db_name, o.name 
    , (CASE upper(o.xtype) 
      WHEN ''C'' THEN ''CHECK constraint''   
      WHEN ''D'' THEN ''Default or DEFAULT constraint''      
      WHEN ''F'' THEN ''FOREIGN KEY constraint'' 
      WHEN ''L'' THEN ''Log''                 
      WHEN ''FN'' THEN ''Scalar function''   
      WHEN ''IF'' THEN ''Inline table-function'' 
      WHEN ''PK'' THEN ''PRIMARY KEY or UNIQUE constraint'' 
      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 ''UQ'' THEN ''UNIQUE constraint (type is K)''     
      WHEN ''X'' THEN ''Extended stored procedure''       
     ELSE upper(o.xtype) END) Type 
    , (CASE upper(o.xtype) 
      WHEN ''PK'' THEN (select object_name(parent_object_id) FROM sys.key_constraints (nolock) WHERE o.name=name) 
      WHEN ''F'' THEN (select object_name(parent_object_id) FROM sys.foreign_keys (nolock) WHERE o.name=name) 
      WHEN ''TR'' THEN (select object_name(parent_id) FROM sys.triggers (nolock) WHERE o.name=name)  
     ELSE '''' END) as Parent_Object 
FROM sysobjects o (nolock) 
INNER JOIN syscomments sc (nolock) ON o.id = sc.id 
WHERE UPPER(text) LIKE UPPER(@SearchStr) AND substring(o.name,1,3)<> ''dt_'' 
GROUP BY o.name, o.xtype 
END' 
GO 
+0

我喜歡這個。謝謝! – Jason 2017-12-07 23:07:26

1

我找到了這樣的解決方案..

USE [Database] 
GO 

SELECT 
referencing_schema_name = SCHEMA_NAME(o.SCHEMA_ID), 
referencing_object_name = o.name, 
referencing_object_type_desc = o.type_desc, 
referenced_schema_name, 
referenced_object_name = referenced_entity_name, 
referenced_object_type_desc = o1.type_desc, 
referenced_server_name, referenced_database_name 
--,sed.* -- Uncomment for all the columns 
FROM 
sys.sql_expression_dependencies sed 
INNER JOIN 
sys.objects o ON sed.referencing_id = o.[object_id] 
LEFT OUTER JOIN 
sys.objects o1 ON sed.referenced_id = o1.[object_id] 
WHERE 
referenced_entity_name = 'SP_Pay_GetData' 
order by referencing_object_name 

http://blog.sqlauthority.com/2012/12/02/sql-server-find-referenced-or-referencing-object-in-sql-server-using-sys-sql_expression_dependencies/

相關問題