2010-07-28 4 views
0

J'exécute le code suivant via CLR, y a-t-il une raison pour laquelle le message n'est pas imprimé sur le SQL Server, at-il besoin d'attendre que la procédure stockée retourne toutes les lignes est d'environ 7 milliards de lignes de retour)SQLDatareader via CLR ne pas retourner le message SQL droit

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(); 
     } 

Ma procédure stockée:

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

7 milliards de lignes de la procédure stockée? Donc, vous supprimez 7 milliards de lignes d'une plus grande rangée *** une par une ***? – gbn

+1

Wow c'est pourquoi il y a un A en RBAR. –

Répondre

3

Voici comment supprimer 7 milliards de lignes à l'aide d'une opération à base de jeu agréable. Vous ne faites pas abuser itérer à travers un lecteur de données dans CLR.

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

Pour plus, voir cette question Bulk DELETE on SQL Server 2008

Mais pour répondre à votre question, oui, SQL Server ne PRINT (qui est ce que vous faites) immédiatement

+0

Est-ce que cela va sortir de la table dès qu'il atteint le sommet (1000000) au lieu de continuer à balayer toute la table? – RPS

+0

@RPS: Il va supprimer en lots de 1000000 à cause de WHILE (maintenant j'ai corrigé la faute de frappe) – gbn

+0

Cela ne provoquera-t-il pas la croissance du registre SQL extrêmement grand? – RPS

1

Vous pouvez probablement utiliser SqlContext .Pipe.ExecuteAndSend avec RAISERROR WITH NOWAIT pour faire ce que vous voulez sur le message.

Mais je suis avec la réponse de gbn de ne pas avoir besoin du CLR pour les suppressions par lots.

Questions connexes