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语句。我不明白的是:
- 为什么有时有时会出现错误(我已经看过几次成功运行了?)
为什么要在实际的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'
是否可以保证此解决方法能够正常运行而不出现错误?为什么?
- 或者是否存在某种形式的缓存,碰巧对我有用,但不能保证每次调用都能正常工作?
- 是否有更好的方法以编程方式监视复制?
我正在处理同一问题-以编程方式监视复制状态。我发现执行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语句。”的主要内容,如果未能解决你的问题,请参考以下文章