我如何为此使用 EXECUTE 命令?
How can I use the EXECUTE command for this?
我们有一个 SQL Server 2014,有大约 20 多个链接(oracle)服务器。
有时,我需要检查所有这些链接服务器的用户 ID(在 Oracle 端)状态。
我目前为此使用以下 OPENQUERY 语句:
SELECT * FROM OPENQUERY (MYLINKEDORACLESERVER,'SELECT * FROM SYS.USER_USERS')
输出:
但是,由于服务器的数量,我们正在寻找一种更自动化的方式来执行此操作。
SYS.SERVERS 输出所有链接的 oracle 服务器的列表(我添加了 OPENQUERY 语法)
SELECT 'select * from openquery ('+ name +',''SELECT * FROM USER_USERS'')' FROM sys.servers
WHERE provider='OraOLEDB.Oracle'
输出:
如何利用 EXECUTE 语句使其自动执行它输出的每个 OPENQUERY 语句?
期望的输出:
一种方法是对它们进行字符串聚合,然后在一个批次中执行它们。由于您不在 SQL Server 2017+ 中,因此您将使用旧的 FOR XML PATH
方法:
DECLARE @SQL nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) + NCHAR(10);
SET @SQL = STUFF((SELECT @CRLF + N'SELECT * FROM OPENQUERY('+ QUOTENAME(s.[name]) + ',''SELECT * FROM USER_USERS'');'
FROM sys.servers
FOR XML PATH(N''),TYPE).value('(./text())[1]','nvarchar(MAX)'),1,2,N'');
PRINT @SQL; --Your best friend
EXEC sys.sp_executesql @SQL;
我们有一个 SQL Server 2014,有大约 20 多个链接(oracle)服务器。 有时,我需要检查所有这些链接服务器的用户 ID(在 Oracle 端)状态。
我目前为此使用以下 OPENQUERY 语句:
SELECT * FROM OPENQUERY (MYLINKEDORACLESERVER,'SELECT * FROM SYS.USER_USERS')
输出:
但是,由于服务器的数量,我们正在寻找一种更自动化的方式来执行此操作。
SYS.SERVERS 输出所有链接的 oracle 服务器的列表(我添加了 OPENQUERY 语法)
SELECT 'select * from openquery ('+ name +',''SELECT * FROM USER_USERS'')' FROM sys.servers
WHERE provider='OraOLEDB.Oracle'
输出:
如何利用 EXECUTE 语句使其自动执行它输出的每个 OPENQUERY 语句?
期望的输出:
一种方法是对它们进行字符串聚合,然后在一个批次中执行它们。由于您不在 SQL Server 2017+ 中,因此您将使用旧的 FOR XML PATH
方法:
DECLARE @SQL nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) + NCHAR(10);
SET @SQL = STUFF((SELECT @CRLF + N'SELECT * FROM OPENQUERY('+ QUOTENAME(s.[name]) + ',''SELECT * FROM USER_USERS'');'
FROM sys.servers
FOR XML PATH(N''),TYPE).value('(./text())[1]','nvarchar(MAX)'),1,2,N'');
PRINT @SQL; --Your best friend
EXEC sys.sp_executesql @SQL;