sp_replmonitorhelppublisher-“不能嵌套INSERT EXEC语句。”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sp_replmonitorhelppublisher-“不能嵌套INSERT EXEC语句。”相关的知识,希望对你有一定的参考价值。

问题

我在Microsoft SQL Server 2008上收到此错误:

消息8164,级别16,状态1,过程sp_MSload_tmp_replication_status,第80行INSERT EXEC语句不能嵌套。

背景

我正在尝试以编程方式监视Microsoft SQL Server中的复制状态。我在[sp_replmonitorhelppublisher上使用INSERT EXEC语句来获取状态,随后的问题不仅限于此proc,但我提到它是因为proc是内置的,因此我无法重写它获得数据“应该完成的方式”。我的(简化)代码来获取数据是:

declare @t table (
    publisher nvarchar(max) null,
    distribution_db nvarchar(max) null,
    status nvarchar(max) null,
    warning nvarchar(max) null,
    publicationcount nvarchar(max) null,
    returnstamp nvarchar(max) null
)
insert into @t exec sp_replmonitorhelppublisher 'MY_PUBLISHER'

问题

我了解导致错误的MS SQL Server限制,我想内置proc内的某个地方有一些INSERT EXEC语句。我不明白的是:

  1. 为什么有时有时会出现错误(我已经看过几次成功运行了?)
  2. 为什么要在实际的INSERT EXEC正常运行而没有错误之前运行相同的EXEC语句(而不是INSERT EXEC的一部分)的解决方法?即该代码可以正常工作:

    declare @t table (
        publisher nvarchar(max) null,
        distribution_db nvarchar(max) null,
        status nvarchar(max) null,
        warning nvarchar(max) null,
        publicationcount nvarchar(max) null,
        returnstamp nvarchar(max) null
    )
    exec sp_replmonitorhelppublisher 'MY_PUBLISHER' -- extra call before main call
    insert into @t exec sp_replmonitorhelppublisher 'MY_PUBLISHER'
    
  3. 是否可以保证此解决方法能够正常运行而不出现错误?为什么?

  4. 或者是否存在某种形式的缓存,碰巧对我有用,但不能保证每次调用都能正常工作?
  5. 是否有更好的方法以编程方式监视复制?
答案

我正在处理同一问题-以编程方式监视复制状态。我发现执行sp_replmonitor*存储过程也会更新表dbo.MSReplication_monitordata。该表包含复制的当前状态信息。

所以,我的解决方案是执行sp_replmonitorhelppublisher,然后从dbo.MSReplication_monitordata中读取值。

例如:启动发布,然后等待发布完成(在SQL Server代理作业中)是这样的:

USE [DB]
DECLARE @StartDateTime datetime = GETDATE()
EXEC sp_startpublication_snapshot @publication='publ_DB'

USE [distribution]
DECLARE @Status int = 1

WHILE @status NOT IN (2, 6)
BEGIN
    WAITFOR DELAY '00:00:05'
    EXEC sp_replmonitorhelppublisher
    SELECT @Status = status FROM dbo.MSReplication_monitordata WHERE publication='publ_DB' AND agent_type=1 AND time_stamp>@StartDateTime
END

希望这会有所帮助!

以上是关于sp_replmonitorhelppublisher-“不能嵌套INSERT EXEC语句。”的主要内容,如果未能解决你的问题,请参考以下文章