2010-07-28 3 views
0

CLR을 통해 다음 코드를 실행합니다. SQL Server에 메시지가 인쇄되지 않는 이유는 무엇입니까? 저장 프로 시저가 모든 행을 반환 할 때까지 기다려야합니다. 약 7 억 행CLR을 통한 SQLDatareader가 SQL 메시지를 올바르게 반환하지 않음

SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = conn; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.CommandText = "spCommand_Select_Rows_For_Delete"; 
     cmd.CommandTimeout = 41600; 

     SqlDataReader reader = cmd.ExecuteReader(); 
     try 
     { 
      string strSQL = ""; 
      SqlContext.Pipe.Send(DateTime.Now.ToString() + " - Started working with ProductTable"); 

      while (reader.Read()) 
      { 
       strSQL = "DELETE FROM ProductTable WHERE ProductId = " + reader["ProductId"].ToString(); 

       SqlCommand cmdDelete = new SqlCommand(strSQL, conn); 

       cmdDelete.Connection = conn; 
       cmdDelete.CommandTimeout = 20800; 
       cmdDelete.ExecuteNonQuery(); 
      } 

      SqlContext.Pipe.Send(DateTime.Now.ToString() + " - Completed working with ProductTable"); 
     } 
     finally 
     { 
      // Always call Close when done reading. 
      reader.Close(); 
     } 

내 저장 프로 시저)를 호출하는 것입니다 :

SELECT ProductId FROM ProductTable 
    WHERE ProductInfoId IN 
    (
    SELECT ProductInfoId from DeletedProducts 
    ) 
+1

저장 프로 시저의 70 억 개의 행이 있습니까? 따라서 더 큰 행 ***에서 70 억 개의 행을 하나씩 삭제합니다 ***. – gbn

+1

와우 그래서 RBAR에 A가 있습니다. –

답변

3

여기 당신이 좋은 세트를 기반으로 작업을 사용하여 70 억 개의 행을 삭제하는 방법은 다음과 같습니다. 당신은 악용을하지 않습니다 CLR의 datareader를 통해 반복합니다. 자세한 내용은

SELECT 'Starting' 
WHILE ROWCOUNT <> 0 
    DELETE TOP (1000000) P 
    FROM ProductTable P 
    WHERE EXISTS (
     SELECT * from DeletedProducts DP WHERE P.ProductInfoId = DP.ProductInfoId 
    ) 

,이 질문에 Bulk DELETE on SQL Server 2008

그러나 귀하의 질문에 대답하기 위해, 예, SQL 서버하지 않습니다 바로 (당신이 무슨 일을하는지입니다) PRINT

+0

전체 테이블을 계속 스캔하는 대신 상단 (1000000)에 도달하자마자 테이블에서 벗어날 수 있습니까? – RPS

+0

@RPS : WHILE로 인해 1000000의 배치에서 삭제됩니다 (이제는 오타가 수정되었습니다) – gbn

+0

SQL LOG가 극도로 커지지 않게 할 수 있습니까? – RPS

1

당신은 아마 사용할 수는 SqlContext 참조 메시지에 대해 원하는 것을 수행하려면 .Pipe.ExecuteAnd를 RAISERROR WITH NOWAIT으로 보내십시오.

하지만 일괄 삭제를 위해 CLR이 필요하지 않다는 것에 대한 gbn의 답변이 있습니다.

관련 문제