如果我想在SQL Server中查找引用对象的内容,搜索syscomments是否全面?
假设我有一个表中的信息,它位于错误的数据库中,比如Items数据库中的Customer info。我真的很想移动这些信息,但我需要找出谁在使用它。如果我使用这段代码来搜索表名,比如CustomerContactNumber,是否有可能出现遗漏?我将忽略在数据库之外发生的任何组合SQL,我可以在源代码管理中对其进行文本搜索,另外,在这种情况下,您不认为他们的代码应该被破坏吗?。[不是我的代码,我是从某处,可能是在这里取的]:如果我想在SQL Server中查找引用对象的内容,搜索syscomments是否全面?,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,假设我有一个表中的信息,它位于错误的数据库中,比如Items数据库中的Customer info。我真的很想移动这些信息,但我需要找出谁在使用它。如果我使用这段代码来搜索表名,比如CustomerContactNumber,是否有可能出现遗漏?我将忽略在数据库之外发生的任何组合SQL,我可以在源代码管理中对其进行文本搜索,另外,在这种情况下,您不认为他们的代码应该被破坏吗?。[不是我的代码,我是从某处,可能是在这里取的]: declare @Search varchar(255) SET @S
declare @Search varchar(255)
SET @Search='%CustomerContactNumbers%'
SELECT DISTINCT
LEFT(so.name, 100) AS Object_Name,
"object_type"=left(
case so.type
when 'U' then 'Table - User'
when 'S' then 'Table - System'
when 'V' then 'Table - View'
when 'TR' then 'Trigger'
when 'P' then 'Stored Procedure'
when 'C' then 'Constraint - Check'
when 'D' then 'Default'
when 'K' then 'Key - Primary'
when 'F' then 'Key - Foreign'
when 'L' then 'Log'
when 'R' then 'Rule'
when 'RF' then 'Replication Filter stp'
else '<<UNKNOWN '''+so.type+'''>>'
end -- case so.type
,25)
FROM syscomments sc
INNER JOIN sysobjects so
ON so.id = sc.id
WHERE
text Like '%'+@Search+'%'
ORDER BY
2,1
够了吗 不完全是这样,因为syscomments被分解成4k块。也就是说,如果对您正在查找的对象的引用恰好位于该4k边界上,那么该查询将不会在任何单个4k块中找到它。如果您使用的是2005+版本,那么您可以使用sys.sql_模块,这将为您提供更好的答案,但您还需要仔细检查可能有定义的其他表,例如检查约束
另一个问题是其他数据库中引用这些对象的对象—这些对象不会被您的查询提取。您没有指定您使用的SQL Server版本。我假设是2000年,但如果是2005年或更高版本,则应该查看目录视图和/或函数。举个简单的例子:
SELECT SCHEMA_NAME(schema_id) +'.'+ name
FROM sys.objects
WHERE OBJECT_DEFINITION(object_id) LIKE '%' + @Search + '%';
-- or
SELECT OBJECT_SCHEMA_NAME(object_id) +'.'+ OBJECT_NAME(object_id)
FROM sys.sql_modules
WHERE [definition] LIKE '%' + @Search + '%';
此外,您可能还想查看以下有关RedGate新的免费SQL搜索工具的StackOverflow线程,以及一些替代方法:
如果你真的被困在2000年,那么我在大约10年前写的这篇文章可能仍然是相关和有用的,包括适应Matt提到的4K块问题:
哇,4k的边界让问题变得更加棘手。我没有考虑过。隐马尔可夫模型。