2010-09-09 56 views
17

Tôi đang cố gắng tìm tất cả các tham chiếu đến một đối tượng trong cơ sở dữ liệu SQL Server.Tìm tất cả các tham chiếu đến một đối tượng trong cơ sở dữ liệu SQL Server

Tôi có thể tìm kiếm nhanh như thế nào? SQL Server Management Studio dường như không làm điều đó. Tôi sử dụng http://www.red-gate.com/products/SQL_Search/ nhưng tôi muốn tìm giải pháp Microsoft "chính thức" này. Là nó trong một sản phẩm khác?

Ví dụ: khi tôi thực hiện tìm kiếm hàng loạt trong studio trực quan, tôi muốn có thể tìm thấy thứ gì đó trong tất cả các quy trình được lưu trữ.

Hoặc có thể tôi không mã hóa đúng cách này?

Carl

Trả lời

0

Tôi không chắc chắn về 'chính thức microsoft' cách nhưng tôi đã sử dụng SqlDigger trong quá khứ. Không tệ.

Nếu bạn muốn làm điều đó trong VS, sau đó bạn sẽ cần văn bản của tất cả các procs của bạn bao gồm trong dự án của bạn.

+0

Liên kết này đã chết. Nhiều nơi cung cấp tải xuống công cụ này, nhưng tôi không thấy công cụ chính thức. Tôi thường chỉ sử dụng plugin Tìm kiếm SQL miễn phí của RedGate thay vì (http://www.red-gate.com/products/sql-development/sql-search/). – Brian

1

tôi sử dụng truy vấn này để tìm kiếm tất cả các bảng (hoặc văn bản) trong thủ tục lưu trữ:

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

Xem câu trả lời của tôi vì sao bạn nên kiểm tra 'SYS.SQL_MODULES' thay thế. –

37

Sử dụng:

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

... vì SYSCOMMENTSINFORMATION_SCHEMA.routines có nvarchar (4000) cột. Vì vậy, nếu "name_of_object" được sử dụng ở vị trí 3998, nó sẽ không được tìm thấy. SYSCOMMENTS không có nhiều dòng, nhưng INFORMATION_SCHEMA.routines cắt ngắn.

+1

Cảm ơn ... mặc dù tôi ước bạn sẽ nói với tôi điều này một vài tuần trước !!! – Martin

+0

@MArtin câu hỏi đã được hỏi chỉ 20 giờ trước ... –

+0

sys.sql_modules không có sẵn trong SQL Server 2000 tuy nhiên. – DeanOC

-2

Trong SQL 2000, đây là truy vấn có thể tìm kiếm các định nghĩa đối tượng bên trong, hỗ trợ chuỗi tìm kiếm có tối đa 2000 ký tự. Nó sử dụng các khối trong bảng 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

Điều gì không thích về câu trả lời này!?!?! – ErikE

0

Phòng quản lý máy chủ SQL có tính năng Chế độ xem phụ thuộc khi bạn nhấp chuột phải vào đối tượng trong Object Explorer. Đây có phải là những gì bạn đang tìm kiếm không?

+0

Chế độ xem Phụ thuộc sẽ không cho bạn biết đối tượng, ví dụ: một bảng hoặc khung nhìn, được tham chiếu trong SQL động. Truy vấn được cung cấp bởi OMG Ponies sẽ. – DeanOC

1

Nếu bạn muốn sử dụng OMG Ponies sql làm lối tắt bàn phím trong SSMS, hãy thêm SP sau vào db chính của bạn.

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 

Sau đó, bạn chỉ cần thêm dbo.SP_FindAllReferences các phím tắt bàn phím của bạn và sau đó bạn có thể sử dụng nó trong bối cảnh của bất kỳ DB trên máy chủ của bạn.

Chúc mừng!

NB: Nếu bạn đang sử dụng SQL Server 2005, bạn sẽ phải thay thế

@sql += 

với

@sql = @sql + 
1

Với việc sử dụng một SQL sp không có giấy tờ: 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

Tôi thích điều này. Cảm ơn bạn! – Jason

1

Tôi đã tìm thấy giải pháp như thế này ..

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/

Các vấn đề liên quan