跨服务器执行
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
我有几个链接服务器,有大量的数据库和大量的视图和 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