[英]SQL Server stored procedure that returns processed records number
我有一個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客戶端。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.