SQLDatareader через CLR неправильно возвращает сообщение SQL - PullRequest
0 голосов
/ 28 июля 2010

Я выполняю следующий код через CLR, есть ли причина, по которой сообщение не распечатывается на SQL Server, нужно ли ждать, пока хранимая процедура вернет все строки (для возврата требуется около 7 миллиардов строк)

    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
    )

Ответы [ 2 ]

3 голосов
/ 28 июля 2010

Вот как вы удаляете 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
    )

Подробнее см. В этом вопросе Массовое УДАЛЕНИЕ в SQL Server 2008

Но, чтобы ответить на ваш вопрос, да, SQL Server не будет PRINT (что вы и делаете) немедленно

1 голос
/ 29 июля 2010

Возможно, вы могли бы использовать SqlContext.Pipe.ExecuteAndSend с RAISERROR WITH NOWAIT , чтобы сделать то, что вы хотите о сообщении.

Но я с ответом gbn о том, что CLR не нуженпакетное удаление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...