【问题标题】:SQL Server stored procedure that returns processed records number返回已处理记录数的 SQL Server 存储过程
【发布时间】:2012-10-11 09:26:43
【问题描述】:

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

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

我认为使用触发器或某些计划任务可能很有用,但我不知道如何实现它。

【问题讨论】:

    标签: c# sql-server stored-procedures timer return


    【解决方案1】:

    所以这是一个非常有趣的问题。大约 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 客户端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      相关资源
      最近更新 更多