Sql server 查找使用链接服务器的所有视图

Sql server 查找使用链接服务器的所有视图,sql-server,tsql,Sql Server,Tsql,我正在更新链接服务器的url。在进行更改之前,我想知道所有引用此链接服务器的视图。是否有任何编程方式(TSQL)来执行此任务 谢谢你的帮助 我使用的是SQLServer2005、2008和2012。引用链接服务器的数据库服务器大多是SQL Server 2005,虽然它可能会返回误报,并且不会捕获使用动态SQL构造四部分名称的任何情况,但这可能是最简单的方法: SELECT name FROM sys.views WHERE LOWER(OBJECT_DEFINITION([object_id]

我正在更新链接服务器的url。在进行更改之前,我想知道所有引用此链接服务器的视图。是否有任何编程方式(TSQL)来执行此任务

谢谢你的帮助


我使用的是SQLServer2005、2008和2012。引用链接服务器的数据库服务器大多是SQL Server 2005

,虽然它可能会返回误报,并且不会捕获使用动态SQL构造四部分名称的任何情况,但这可能是最简单的方法:

SELECT name FROM sys.views
WHERE LOWER(OBJECT_DEFINITION([object_id])) LIKE LOWER('%LinkedServerName%');

如果您需要按名称查找数据库对象(如表、列、触发器)-请查看名为“免费”的“红门”工具,它会在整个数据库中搜索任何类型的字符串

对于任何DBA或数据库开发人员来说,它都是一个非常好的必备工具-我是否已经提到过它绝对是免费的,可以用于任何类型的用途???

尝试以下方法:

SELECT name, OBJECT_DEFINITION([object_id]) FROM sys.views
where OBJECT_DEFINITION([object_id]) like '%.%.dbo.%'

这将找到以下视图:

SELECT t2.name, OBJECT_DEFINITION(t1.[object_id]) view_definition  
FROM sys.views t1 join sys.servers t2 on 
OBJECT_DEFINITION(t1.[object_id]) like '%['+ t2.name + '].%' ESCAPE '['
如果表、视图、架构或数据库与链接服务器具有相同的名称,则可能会失败

如果某些视图未通过第一次检查,您可以添加这一行,该部分不检查链接服务器名称周围的方括号。但请注意,这一部分更可能包括 额外不需要的视图

or OBJECT_DEFINITION(t1.[object_id]) like '% '+ t2.name + '.%'

编辑:将sys.sysservers更改为sys.servers。感谢Aaron Bertrand

或对象定义([OBJECT\u id]),如“%.%.[dbo].%.”这与我的答案不同(更好),因为您已经硬编码了dbo架构并返回了任何由四部分组成的名称(包括您不寻找的其他链接服务器)?我现在很困惑。@AaronBertrand你完全正确,这可能会失败。如果视图的定义如下:“选择*from database.dbo.field join database.dbo.field on 1=1”,则此fails@t-clausen.dk你能解释一下吗?我在我们的一个数据库里试过,具有LinkedServer的4个视图中有4个未找到found@t-clausen.dk您是否将
LinkedServerName
更改为链接服务器的实际名称???我希望OP有服务器链接服务器、“此链接服务器”和“链接服务器的url”。我把它读作复数。当添加更多的链接服务器时,硬编码并不方便。@t-clausen.dk:在说“否”之前检查区分大小写的排序规则。或将所有小写字母进行校对。我知道这是可行的:答案3可能是重复的吗?为什么是sys.sysservers而不是sys.servers?如果您正在寻找特定的24个链接服务器,但定义了100个链接服务器,该怎么办?另外,第二个子句中的前导空格将丢失前面有制表符或回车符/换行符的引用。我使用sys.sysservers是因为我不知道这是旧方法,感谢您指出这一点。QA指定:查找带有链接服务器的视图,这就是我试图做的。我从未见过或在链接的服务器、数据库、架构或列之间创建过换行符、空格或制表符。但既然你提到了这一点,我意识到这是可能的,我当然没料到会发生这种情况。当我使用您的版本时,我返回了43行,而只有11行有链接的服务器。所以我想这两种解决方案都有缺陷。我不认为有一个完美的解决方案。这就是为什么我在解决方案的开头提到了关于误报、动态SQL等的注释,以及为什么我对您含糊不清的“this will not catch it”评论感到失望。您需要将srvname更改为[name]-sys.servers上不存在srvname对我来说也是转义['零件对我不起作用。当我移除它时,它就可以正常工作。因此,无论是谁使用它,都取决于你是否使用了括号,请记住这一点。