SqlAll <Bulk> <Copy.Write> <ToA <Server (c #)를 취소 할 수 있습니까?

c# sqlbulkcopy sql-server

문제

저는 수십억 개의 행을 복사하는 데 SqlAll <Copy> Www <Toa <Server (C #)를 사용하고 있으며 완료하는 데 몇 시간이 걸립니다. 때로는 긴급한 작업에 대한 작업을 중지해야하지만 그렇게하는 방법을 모르겠습니다. 알림 이벤트가 도착할 때 뭔가를 할 수 있습니까 (Sql? <Bulk? <Copy.NotifyAfter 및 Sql? <Bulk? <Copy.SqlRowsCopied)?

수락 된 답변

MSDN 설명서의 내용 :

사용자가 이벤트에서 작업을 취소하려면 SqlRowsCopiedEventArgs의 Abort 속성을 사용할 수 있습니다.

따라서 다음 코드가 트릭을 수행해야합니다.

    SqlBulkCopy cp = new SqlBulkCopy("your connection string");
    cp.NotifyAfter = 1000; // use here whatever number floats your boat
    cp.SqlRowsCopied += (sender, eventArgs) => eventArgs.Abort = true; // add some more conditions here

인기 답변

통지 이벤트가 도착했을 때 무엇인가 할 수 있습니까?

는 SQL 관리자로서 당신은 항상 대량로드를 실행하는 세션을 찾을 수 KILL 같이, 그것을 :

declare @spid int = (
select session_id
from sys.dm_exec_requests
where command = 'BULK INSERT')

if @spid is not null
begin
    declare @sql varchar(200) = concat('kill ',@spid)

    exec ( @sql )

end

코드에서이 작업을 수행하려면 Cancelation Token을 수락하는 WriteToServer의 Async 버전을 사용하십시오. 예

  static void Main(string[] args)
    {
        using (var src = new SqlConnection("server=.;database=tempdb;integrated security=true"))
        using (var dest = new SqlConnection("server=.;database=tempdb;integrated security=true"))
        {
            src.Open();
            dest.Open();
            var cmd = new SqlCommand("create table #t(id int)", dest);
            cmd.ExecuteNonQuery();

            bool cancel = false;
            var cancelationTokenSource = new CancellationTokenSource();
            var srcCmd = new SqlCommand("select row_number() over (order by (select null)) id from sys.objects o, sys.columns c, sys.columns c2", src);
            using (var rdr = srcCmd.ExecuteReader())
            {
                var bc = new SqlBulkCopy(dest);
                bc.NotifyAfter = 10000;
                bc.SqlRowsCopied += (s, a) =>
                {
                    Console.WriteLine($"{a.RowsCopied} rows copied");
                    if (cancel)
                    {
                        dest.Close();
                    }
                };

                bc.DestinationTableName = "#t";
                bc.ColumnMappings.Add(new SqlBulkCopyColumnMapping("id", "id"));

                var task = bc.WriteToServerAsync(rdr, cancelationTokenSource.Token);

                Console.WriteLine("Hit any key to cancel the bulk load");
                while (!task.Wait(1000))
                {
                    if (Console.KeyAvailable)
                    {

                        cancelationTokenSource.Cancel();
                        try
                        {
                            task.Wait();
                        }
                        catch (AggregateException ex)
                        {
                            Console.WriteLine(ex.InnerException.Message);
                            Console.WriteLine("WriteToServer Canceled");
                            break;
                        }
                    }
                }

                Console.WriteLine("Hit any key to exit");
                return;
            }




        }
    }


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.