如何抑制SQL Server中另一个存储过程调用的存储过程的SELECT输出?

我不是在说做一个“SET NOCOUNT OFF”。 但我有一个存储过程,我用它来插入一些表中的数据。 这个过程创build一个XML响应string,让我给你一个例子:

CREATE PROCEDURE [dbo].[insertSomeData] (@myParam int) AS DECLARE @reply varchar(2048) ... Do a bunch of inserts/updates... SET @reply = '<xml><big /><outputs /></xml>' SELECT @reply GO 

所以我把一个使用这个SP的脚本放在一起,而xml的“输出”变得太多了(它已经崩溃了我的盒子一次)。

有没有办法抑制或redirect从此存储过程生成的输出? 我不认为修改这个存储过程是一个选项。

谢谢。


我想我应该澄清。 上面的这个SP被我编写的T-SQL Update脚本调用,要通过企业工作室pipe理器等来运行。

这不是我曾经写过的最优雅的SQL(一些psuedo-sql):

 WHILE unprocessedRecordsLeft BEGIN SELECT top 1 record from updateTable where Processed = 0 EXEC insertSomeData @param = record_From_UpdateTable END 

所以可以说,UpdateTable中有一些5万条logging。 该SP被称为50k次,写入50k xmlstring到输出窗口。 它没有带来的SQL Server停下来,只是我的客户端应用程序(SQL服务器pipe理工​​作室)。

我想我find了一个解决scheme。

所以我现在可以在我的SQL脚本中做的是这样的(sql-psuedo代码):

 create table #tmp(xmlReply varchar(2048)) while not_done begin select top 1 record from updateTable where processed = 0 insert into #tmp exec insertSomeData @param=record end drop table #tmp 

现在,如果有更有效的方法来做到这一点。 SQL Server有类似于/ dev / null的东西吗? 一个空表或东西?

你正在寻找的答案可以在Josh Burke的类似的SO问题中find:

 /* Assume this table matches the output of your procedure */ DECLARE @tmpNewValue TABLE (newvalue int) INSERT INTO @tmpNewValue EXEC ProcedureB 

回答这个问题,“我如何抑制存储过程输出?” 真的取决于你想要完成什么。 所以我想贡献我遇到的:

我需要压缩存储过程(USP)输出,因为我只是想从输出行计数(@@ ROWCOUNT)。 我做了什么,这可能不适用于每个人,因为我的查询已经是dynamicSQL我添加了一个名为@silentExecution的参数有问题的USP。 这是一个参数,我默认为零(0)。

接下来,如果将@silentExecution设置为一(1),我会将表内容插入一个临时表中,这将暂停输出,然后执行@@ ROWCOUNT而不会出现问题。

USP例子:

 CREATE PROCEDURE usp_SilentExecutionProc @silentExecution bit = 0 AS BEGIN SET NOCOUNT ON; DECLARE @strSQL VARCHAR(MAX); SET @strSQL = ''; SET @strSQL = 'SELECT TOP 10 * '; IF @silentExecution = 1 SET @strSQL = @strSQL + 'INTO #tmpDevNull '; SET @strSQL = @strSQL + 'FROM dbo.SomeTable '; EXEC(@strSQL); END GO 

那么你可以像这样执行整个事情:

 EXEC dbo.usp_SilentExecutionProc @silentExecution = 1; SELECT @@ROWCOUNT; 

这样做的目的是,如果您需要USP能够在其他用途​​或案例中返回结果集,但仍然只用于行。

只是想分享我的解决scheme。

男人,这真的是一台计算机做你告诉它做的事情,而不是你想做的事情。

如果你不希望它返回结果,那么不要求它返回结果。 将存储过程重构为两个:

 CREATE PROCEDURE [dbo].[insertSomeData] (@myParam int) AS BEGIN DECLARE @reply varchar(2048) --... Do a bunch of inserts/updates... EXEC SelectOutput END GO CREATE PROCEDURE SelectOutput AS BEGIN SET @reply = '<xml><big /><outputs /></xml>' SELECT @reply END 

你从哪个客户端调用存储过程? 说它来自C#,并且你称它为:

 var com = myConnection.CreateCommand(); com.CommandText = "exec insertSomeData 1"; var read = com.ExecuteReader(); 

这将不会从服务器检索结果; 你必须为此调用Read():

 read.Read(); var myBigString = read[0].ToString(); 

所以如果你不调用Read,XML将不会离开Sql Server。 您甚至可以使用ExecuteNonQuery调用该过程:

 var com = myConnection.CreateCommand(); com.CommandText = "exec insertSomeData 1"; com.ExecuteNonQuery(); 

在这里,客户甚至不会要求select的结果。

您可以创build一个执行此操作的SQL CLR存储过程。 应该很容易。

我最近在编写一个迁移脚本时遇到了类似的问题,由于问题以不同的方式得到解决,我想logging下来。 我几乎杀了我的SSMS客户端运行一个简单的while循环3000次,并调用一个程序。

 DECLARE @counter INT SET @counter = 10 WHILE @counter > 0 BEGIN -- call a procedure which returns some resultset SELECT @counter-- (simulating the effect of stored proc returning some resultset) SET @counter = @counter - 1 END 

脚本结果使用SSMS执行,查询窗口的默认选项设置为显示“结果到网格”[Ctrl + d快捷键]。

简单的解决scheme:尝试将结果设置为文件,以避免在SSMS客户端上构build和绘制网格。 [CTRL + SHIFT + F键盘快捷键将查询结果设置为文件]。

此问题与: stackoverflow查询有关

我不知道如果SQL Server有一个选项来抑制输出(我不认为它),但SQL查询分析器有一个选项(在结果标签下)“放弃结果”。

你是通过isql运行这个吗?

你说你的服务器崩溃了。 什么是崩溃消耗这个SQL或SQL Server本身(假设SQL Server)的输出的应用程序。

如果您使用.Net Framework应用程序调用存储过程,请查看SQLCommand.ExecuteNonQuery。 这只是执行没有结果返回的存储过程。 如果问题在SQL Server级别,那么你将不得不做一些不同的事情(即更改存储过程)。

曾经试过SET NOCOUNT ON; 作为一个选项?