如何抑制sp_addarticle输出的DBCC执行完成消息?
解决SQL Server 2022中sp_addarticle输出多余DBCC消息的问题
针对SQL Server 2022升级后sp_addarticle输出多余的“DBCC execution completed. If DBCC printed error messages, contact your system administrator.”消息、打乱原有输出格式的问题,这里有几个实用的解决办法:
方法1:捕获输出并过滤无用消息
适合在存储过程或脚本中调用sp_addarticle时使用,通过临时表捕获所有输出,再筛选掉DBCC相关的无用内容:
-- 创建临时表存储sp_addarticle的输出 CREATE TABLE #SPOutput (Message NVARCHAR(MAX)) -- 执行sp_addarticle并将输出写入临时表 INSERT INTO #SPOutput EXEC sp_addarticle @publication = 'my_publication', @article = N'my_table', @source_owner = N'dbo', @source_object = N'my_table', @type = N'logbased', @description = null, @creation_script = null, @pre_creation_cmd = N'drop', @schema_option = 0x000000000803509F, @identityrangemanagementoption = N'manual', @destination_table = N'my_table', @destination_owner = N'dbo', @vertical_partition = N'false', @ins_cmd = N'CALL [sp_MSins_dbomy_table]', @del_cmd = N'CALL [sp_MSdel_dbomy_table]', @upd_cmd = N'SCALL [sp_MSupd_dbomy_table]' -- 只输出有效消息,过滤DBCC内容 SELECT Message FROM #SPOutput WHERE Message NOT LIKE 'DBCC execution completed.%' -- 清理临时表 DROP TABLE #SPOutput
方法2:SQLCMD模式下重定向输出
如果是通过SQLCMD工具执行脚本,可以直接重定向输出,避免无用消息显示在控制台:
方式A:将有效输出写入文件
:OUT C:\Temp\ReplicationOutput.txt -- 指定输出文件路径 USE [my_database]; EXEC sp_addarticle -- 此处填入你的sp_addarticle参数 :OUT CONSOLE -- 恢复输出到控制台
方式B:直接丢弃所有信息输出(仅保留错误提示)
:OUT NUL -- 将信息输出重定向到空设备 USE [my_database]; EXEC sp_addarticle -- 此处填入你的sp_addarticle参数 :OUT CONSOLE -- 恢复输出到控制台
方法3:自定义包装存储过程
如果需要批量调用sp_addarticle,可以创建一个包装存储过程,内部自动过滤无用消息,后续直接调用这个包装过程即可统一处理:
CREATE PROCEDURE dbo.sp_WrapAddArticle @publication NVARCHAR(128), @article NVARCHAR(128), @source_owner NVARCHAR(128), @source_object NVARCHAR(128), @type NVARCHAR(128) = N'logbased', @description NVARCHAR(255) = NULL, @creation_script NVARCHAR(255) = NULL, @pre_creation_cmd NVARCHAR(10) = N'drop', @schema_option BINARY(8) = 0x000000000803509F, @identityrangemanagementoption NVARCHAR(128) = N'manual', @destination_table NVARCHAR(128) = NULL, @destination_owner NVARCHAR(128) = N'dbo', @vertical_partition NVARCHAR(5) = N'false', @ins_cmd NVARCHAR(255) = NULL, @del_cmd NVARCHAR(255) = NULL, @upd_cmd NVARCHAR(255) = NULL AS BEGIN SET NOCOUNT ON; -- 创建临时表存储输出 CREATE TABLE #Output (Msg NVARCHAR(MAX)); -- 调用原生sp_addarticle并捕获输出 INSERT INTO #Output EXEC sp_addarticle @publication = @publication, @article = @article, @source_owner = @source_owner, @source_object = @source_object, @type = @type, @description = @description, @creation_script = @creation_script, @pre_creation_cmd = @pre_creation_cmd, @schema_option = @schema_option, @identityrangemanagementoption = @identityrangemanagementoption, @destination_table = @destination_table, @destination_owner = @destination_owner, @vertical_partition = @vertical_partition, @ins_cmd = @ins_cmd, @del_cmd = @del_cmd, @upd_cmd = @upd_cmd; -- 过滤并返回有效消息 SELECT Msg FROM #Output WHERE Msg NOT LIKE 'DBCC execution completed.%'; -- 清理临时表 DROP TABLE #Output; END GO -- 调用示例 EXEC dbo.sp_WrapAddArticle @publication = 'my_publication', @article = N'my_table', @source_owner = N'dbo', @source_object = N'my_table' -- 其他参数按需传入
内容的提问来源于stack exchange,提问作者ecksfiftyone
相关产品推荐
相关产品推荐

