我正在设置一个作业来遍历链接服务器列表并对每个服务器执行特定查询。我正在尝试在 TRY-CATCH 块内执行查询,因此如果某个特定服务器出现问题,我可以将其记录下来,然后继续处理其他服务器。
我在循环内执行的查询如下所示:
BEGIN TRY
SELECT *
FROM OPENQUERY([server1], 'SELECT 1 AS c;');
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER(), ERROR_MESSAGE();
END CATCH;
PRINT 'We got past the Catch block!';
Run Code Online (Sandbox Code Playgroud)
如果连接到服务器出现问题,代码会立即失败并且不会传输到CATCH
块。如果服务器连接但在实际查询中存在错误,例如被零除,那么这会被CATCH
块按预期捕获。
例如,我为一个我知道不存在的名称创建了一个链接服务器。执行上述操作时,我只得到:
OLE DB provider "SQLNCLI" for linked server "nonserver" returned message
"Login timeout expired".
OLE DB provider "SQLNCLI" for linked server "nonserver" returned message
"An error has occurred while establishing a connection to the server.
When connecting to SQL Server 2005, this failure may be …
Run Code Online (Sandbox Code Playgroud) 我们有一个带有 16 个 CPU 内核的 SQL Server 2012 实例。当查看 sys.dm_os_schedulers 时,我们看到预期的 16 行是“VISIBLE ONLINE”,每个核心一个。错误日志在启动时显示以下标准条目:
SQL Server 检测到 2 个插槽,每个插槽 8 个内核,每个插槽 8 个逻辑处理器,总共 16 个逻辑处理器;使用基于 SQL Server 许可的 16 个逻辑处理器。这是一条情报信息; 无需用户操作。
然而 sys.dm_os_schedulers 也包含大约。1200 行是“HIDDEN ONLINE”。
服务器未使用可用性组或镜像,并且未启用资源调控器。
问题是每个隐藏的调度器似乎都被分配了一个工作线程,所以我们的监控软件不断提醒服务器线程用完,即使查询运行得非常愉快并且似乎对性能没有任何实际影响.
我知道隐藏的调度程序只对内部系统进程可用,但你知道是什么导致显示这么多吗?