跨服务器执行

Cross server EXEC

我有几个链接服务器,有大量的数据库和大量的视图和 table。 数据库名称就像一组随机的字母和数字,对我来说没有任何意义。 需要在哪个服务器上找到某个视图。

DECLARE @servers AS TABLE (srv_name NVARCHAR(300), srv_providername NVARCHAR(300), srv_product NVARCHAR(300), srv_datasource NVARCHAR(300), srv_pstring NVARCHAR(300), srv_location NVARCHAR(300), srv_cat NVARCHAR(300) );
INSERT INTO @servers EXEC sp_linkedservers

DECLARE @sql nvarchar(MAX) = N''

SELECT @sql += 
N'SELECT 
    ''' + QUOTENAME(srv_name) + ''' AS [Server],
    QUOTENAME(name) AS [DB]
FROM ' + QUOTENAME(srv_name) + '.[master].[sys].[databases]
WHERE HAS_PERMS_BY_NAME(name, ''DATABASE'', ''SELECT'') = 1
UNION ALL
'
FROM @servers

SET @sql = LEFT(@sql, LEN(@sql) - 11);
EXEC @sql

它在 EXEC 上失败了。说查询无效,但如果我复制粘贴查询 运行 它 - 效果很好。

需要执行此 exec,生成带有服务器和可用数据库的临时 table,查询每个服务器上每个数据库的 sys.all_object

我的本地主机上的输出有 1 个服务器

> (1 row(s) affected) Msg 203, Level 16, State 2, Line 17 The name
> 'SELECT 
>     '[localhost]' AS [Server],
>     QUOTENAME(name) AS [DB] FROM [localhost].[master].[sys].[databases] WHERE HAS_PERMS_BY_NAME(name,
> 'DATABASE', 'SELECT') = 1 ' is not a valid identifier.

我也犯了同样的错误。 所以就这样执行:

exec sp_executesql @sql