You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找数据库中引用其他服务器的所有视图/存储过程

查找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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 17:43:22