我試圖找到對SQL Server數據庫中的對象的所有引用。查找對SQL Server數據庫中的對象的所有引用
我該如何快速搜索? SQL Server Management Studio似乎沒有這樣做。我使用http://www.red-gate.com/products/SQL_Search/,但我想找到「官方」微軟解決方案。它是否在另一個產品?
例如,當我在Visual Studio中進行大量搜索時,我希望能夠在所有存儲過程中找到某種東西。
或者我沒有用正確的方式編碼?
卡爾
我試圖找到對SQL Server數據庫中的對象的所有引用。查找對SQL Server數據庫中的對象的所有引用
我該如何快速搜索? SQL Server Management Studio似乎沒有這樣做。我使用http://www.red-gate.com/products/SQL_Search/,但我想找到「官方」微軟解決方案。它是否在另一個產品?
例如,當我在Visual Studio中進行大量搜索時,我希望能夠在所有存儲過程中找到某種東西。
或者我沒有用正確的方式編碼?
卡爾
我不知道的「微軟官方」的方式,但我已經在過去使用SqlDigger。不算太差。
如果你想在VS中做到這一點,那麼你將需要包含在你的項目中的所有過程的文本。
我使用這個查詢來尋找在存儲過程中的所有表(或文字):
SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'
請看我的答案,爲什麼你應該檢查'SYS.SQL_MODULES'來代替。 – 2010-09-09 23:31:04
用途:
select object_name(m.object_id), m.*
from sys.sql_modules m
where m.definition like N'%name_of_object%'
...因爲SYSCOMMENTS
和INFORMATION_SCHEMA.routines
具有爲nvarchar(4000)列。所以如果在位置3998使用「name_of_object」,它將不會被找到。 SYSCOMMENTS
確實有多行,但是截斷了INFORMATION_SCHEMA.routines
。
在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%'
);
有什麼不喜歡這個答案!?!?! – ErikE 2016-11-25 03:07:32
當您在對象資源管理器中右鍵單擊某個對象時,SQL Server Management Studio具有視圖依賴關係功能。這是你在找什麼?
查看依賴關係不會告訴你對象的位置,例如。一個表或視圖,在動態SQL中被引用。 OMG Ponies提供的查詢將會。 – DeanOC 2012-01-31 04:08:54
如果您想要使用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 +
通過使用無證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
我喜歡這個。謝謝! – Jason 2017-12-07 23:07:26
我找到了這樣的解決方案..
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
此鏈接已經死了。很多地方提供了這個工具的下載,但我沒有看到官方的。我通常只使用RedGate的免費SQL搜索插件(http://www.red-gate.com/products/sql-development/sql-search/)。 – Brian 2014-09-04 19:26:25