【问题标题】:How can I use the EXECUTE command for this?如何为此使用 EXECUTE 命令?
【发布时间】:2021-08-14 02:04:24
【问题描述】:

我们有一个 SQL Server 2014,有大约 20 多个链接(oracle)服务器。 有时,我需要检查所有这些链接服务器的 USER 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 sql-server exec execute


【解决方案1】:

一种方法是对它们进行字符串聚合,然后在一个批处理中执行它们。由于您不在 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;

【讨论】:

    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多