簡體   English   中英

返回已處理記錄號的SQL Server存儲過程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM