当我执行从多个链接服务器提取信息并聚合数据的存储过程时,偶尔会收到此错误消息。它看起来类似于我下面的内容。
DECLARE Cur CURSOR FOR SELECT name FROM sys.servers WHERE is_linked = 1 AND (@Environments IS NULL OR name IN (SELECT Item FROM clrStringSplit(@Environments, ',')))
OPEN cur
FETCH NEXT FROM cur INTO @Environment
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
SET @Query = '
EXEC ' + @Environment + '.db.dashboard.storedproc ''' + CAST(@StartDate AS VARCHAR(10)) + ''', ''' + CAST(@EndDate AS VARCHAR(10)) + ''''
INSERT INTO #Table (Environment, Column1, Column2, Column3, Column4, Column5, Column6, Column7)
EXEC(@Query)
END TRY
BEGIN CATCH
PRINT 'There was an error trying to query against ' + @Environment
PRINT ERROR_MESSAGE()
END CATCH
FETCH NEXT FROM cur INTO @Environment
END
它在每台服务器上调用的存储过程在每台服务器上都完全相同,并且是从 dbo 模式下的表中提取的基本选择语句。它将“随机”出错,并显示“无法完成游标操作,因为声明游标后表模式已更改”的消息。有时它运行良好,有时则不然。每次运行时,即使背靠背有时会起作用,有时不会。什么可能导致这种情况发生,为什么它如此断断续续?对其中一台服务器上的过程的任何给定调用都可能会生成错误。它尝试查询的服务器并不总是会产生错误。
值得一提的是,我有几个程序执行极其相似但从未产生问题的每个程序。但它们都在同一个模式(dbo)下,这是第一次使用不同的模式。
编辑 - 我忘了提到我曾尝试使用 FAST_FORWARD 游标,但它似乎没有帮助。