2010-07-28 62 views
0

我通過CLR執行下面的代碼,是否有一個原因爲什麼郵件不打印到SQL Server,它是否需要等待,直到存儲過程返回所有行(那裏大約是7億行返回)SQLDatareader通過CLR不返回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

從存儲過程中有7億行?所以你從一個較大的行刪除了70億行***一個接一個***? – gbn 2010-07-28 19:40:11

+1

哇,這就是爲什麼在RBAR中有一個A. – 2010-07-28 21:23:01

回答

3

這裏是你使用一個很好的一套基於操作如何刪除7個十億行。您不要 濫用 迭代CLR中的數據讀取器。

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 Server將不會PRINT(這是你在做什麼)立即

+0

當它碰到頂端(1000000)時,它會突然跳出表而不是繼續掃描整個表嗎? – RPS 2010-07-28 23:27:01

+0

@RPS:由於WHILE(現在我修正了錯字),它會批量刪除1000000 – gbn 2010-07-29 04:42:26

+0

這會不會導致SQL LOG變得非常大? – RPS 2010-07-29 11:04:02

1

你也許可以使用SqlContext .Pipe.ExecuteAndSend與RAISERROR WITH NOWAIT做你想要的消息。

但我與gbn的回答有關不需要CLR批量刪除。