2010-07-28 31 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批量删除。