返回已处理记录号的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客户端。