我正在尝试设置一个流程,该流程将检查可用性组中所有服务器上的代理作业,并报告辅助副本中可能缺少的任何作业。
我对 AG 的所有服务器进行了 CMS 设置,并且可以跨副本运行代理作业查询,但我只想返回某些服务器上的作业,而不是所有服务器上的作业。
我编写了一个查询来使用 COUNT() 获取此信息,但由于查询结果是按服务器分组的,因此这不起作用。我还尝试将结果放入临时表中,看看这是否有帮助,但这似乎没有多大区别。
AG 中有四台服务器,以下查询应返回不在所有四台服务器上的任何作业的名称,但由于它似乎也返回服务器名称,因此无法将它们识别为同一作业.
CREATE TABLE #jobs (
JobName NVARCHAR(128))
INSERT INTO #jobs
SELECT name JobName
FROM sysjobs
SELECT *
FROM #jobs
GROUP BY JobName
HAVING COUNT(*) < 4
ORDER BY JobName
DROP TABLE #jobs
目前的查询将抛出如下结果集:
+------------+------------------------------------------+
| ServerName | JobName |
+------------+------------------------------------------+
| ServerA | DBA DatabaseBackup - AG_DATABASES - FULL |
| ServerA | OutputFile Cleanup |
| ServerB | DBA DatabaseBackup - AG_DATABASES - FULL |
| ServerB | IndexOptimize - USER_DATABASES |
| ServerC | DBA DatabaseBackup - AG_DATABASES - FULL |
| ServerB | IndexOptimize - USER_DATABASES |
| ServerD | DBA DatabaseBackup - AG_DATABASES - FULL |
| ServerD | Output File Cleanup |
+------------+------------------------------------------+
所有四台服务器都存在 DBA DatabaseBackup - AG_DATABASES - FULL 作业,因此我不希望返回该作业,但由于来自 CMS 连接的隐式 servername 列,它无法将它们识别为相同的值。
最佳答案
正如 GMB 提到的,您需要提取“名称”字段的一部分。
我建议将字符串拆分为 ServerName 和 JobName。
假设名称由 - 分隔,就像在您的示例中一样,您的代码可能如下所示。
CREATE TABLE #jobs (
ServerName NVARCHAR(128)
,JobName NVARCHAR(128))
INSERT INTO #jobs
SELECT
LEFT(name,CHARINDEX('-',name)-1) AS ServerName --Takes the Part left of the first -
, RIGHT(name,LEN(name) - CHARINDEX('-',name)) AS JobName --Takes the Part right of the first -
FROM sysjobs
SELECT JobName
FROM #jobs
GROUP BY JobName
HAVING COUNT(*) < 4
ORDER BY JobName
DROP TABLE #jobs
关于sql - 识别辅助副本上缺少的代理作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53650491/