返回已处理记录号的SQL Server存储过程

我有一个Winforms应用程序,它执行一个存储过程,检查几行(大约500k)。 为了告知用户已经处理了多少行,我需要一个存储过程,每n行返回一个值。 例如,每处理1000行(大多数是INSERT )。

否则我只能在处理所有行时通知。 任何提示如何解决这个问题?

我认为使用触发器或某些计划任务可能很有用,但我无法弄清楚如何实现它。

所以这是一个非常有趣的问题。 大约5年前我试过它没有成功,所以这对我来说是一个小挑战:)嗯,这就是我为你所拥有的。

要从SQL Server发送消息,您需要使用带有nowait选项的raiserror命令。 所以我写了一个存储过程

 create procedure sp_test as begin declare @i bigint, @m nvarchar(max) select @i = 1 while @i < 10 begin waitfor delay '00:00:01' select @m = cast(@i as nvarchar(max)) raiserror(@m, 0, 0) with nowait select @i = @i + 1 end end 

如果您尝试在SSMS中执行它,您将看到该消息出现在消息部分,而过程仍然有效。 好的,我们收到了服务器的消息。 现在我们需要在客户端上处理它。

为此,我创建了一个像这样的SQLCommand

 SqlCommand cmd = new SqlCommand("sp_Test"); cmd.Connection = new SqlConnection("Server=HOME;Database=Test;Trusted_Connection=True;"); 

现在要捕获我们使用SqlConnection对象的InfoMessage的消息:

 cmd.Connection.InfoMessage += Connection_InfoMessage; static void Connection_InfoMessage(object sender, SqlInfoMessageEventArgs e) { Console.WriteLine(e.Message); } 

现在我们正在尝试显示消息

 cmd.Connection.Open(); try { SqlDataReader r = cmd.ExecuteReader(); } finally { cmd.Connection.Close(); } 

成功:)

顺便说一下,你不能使用ExecuteNonQuery() ,因为它在执行结束时返回连接的消息。 此外,您可能希望在后台模式下运行查询,因此它不会锁定您的winform客户端。