SQL Server存储过程返回处理的记录数(SQL Server stored procedure

2019-08-01 17:26发布

我有一个WinForms应用程序执行存储过程会检查若干行(约50万)。 为了告知有多少行已经处理的用户,我需要一个存储过程返回一个值每n行。 例如,处理每行1000(最是INSERT )。

否则,我就可以,只有当所有行都被处理通知。 任何提示如何解决此问题?

我想这可能是使用触发器或某些计划的任务是有用的,但我不能想出如何实现它。

Answer 1:

因此,这是非常有趣的问题。 我没有成功尝试过了大约5年前,所以这是一个小的挑战对我来说:)那么,这里的就是我要告诉你。

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

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;");

现在赶上我们使用的消息InfoMessage SqlConnection对象的:

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客户端。



文章来源: SQL Server stored procedure that returns processed records number