如何查找数据库中引用其他服务器的所有视图/存储过程
查找SQL Server中引用远程服务器的数据库对象
方法1:正则匹配精准定位三点式远程引用
针对表/列名带点导致的误判问题,可利用PATINDEX函数结合模式匹配,区分远程服务器引用(server.database.schema.object)和方括号内带点的本地对象(如[My.Table]):
SELECT o.name AS 对象名, o.type_desc AS 对象类型, m.definition AS 对象定义 FROM sys.sql_modules m JOIN sys.objects o ON m.object_id = o.object_id WHERE -- 匹配四个由点分隔的非方括号、非点片段(符合server.db.schema.object结构) PATINDEX(N'%[^.\]]\.[^.\]]\.[^.\]]\.[^.\]]%', m.definition) > 0 -- 排除方括号内部带点的情况(避免误判[My.Table]这类命名) AND PATINDEX(N'%[[][^]]*.[^]]*[]]%', m.definition) = 0
方法2:通过链接服务器列表精准匹配
如果环境中使用了链接服务器,直接关联sys.linked_servers查找引用这些服务器的对象,这是最精准的方式:
SELECT ls.name AS 链接服务器名, o.name AS 对象名, o.type_desc AS 对象类型, m.definition AS 对象定义 FROM sys.linked_servers ls JOIN sys.sql_modules m ON m.definition LIKE N'%' + ls.name + N'.%' JOIN sys.objects o ON m.object_id = o.object_id
方法3:用系统函数验证远程引用
对于找到的可疑对象,可通过sys.dm_sql_referenced_entities确认是否存在明确的远程服务器引用(适用于SQL Server 2008及以上版本):
-- 替换为目标对象名 SELECT referenced_server_name AS 引用的服务器名, referenced_database_name AS 引用的数据库名, referenced_schema_name AS 引用的架构名, referenced_entity_name AS 引用的对象名 FROM sys.dm_sql_referenced_entities('dbo.你的存储过程名', 'OBJECT') WHERE referenced_server_name IS NOT NULL
注意事项
- 加密的存储过程/视图在
sys.sql_modules.definition中会显示为NULL,可通过SSMS的「生成脚本」功能勾选「包括加密对象」获取定义。 - 动态SQL中的远程引用可能需要更复杂的模式匹配,比如匹配单引号内的三点式结构,可根据实际场景调整
PATINDEX的模式。 - 自动查找后建议手动抽查部分结果,避免极端特殊情况的误判。
内容的提问来源于stack exchange,提问作者mizichael
相关产品推荐
相关产品推荐

