Печать SQL-сервера влияла на строки во время цикла с условием продолжения

У меня есть хранимая процедура, работающая на цикличном выполнении SQL-сервера 2008 года за столом ~50 миллионов строк, удаляя записи один день за один раз (приблизительно 25 000 записей в день). Я хочу смочь наблюдать, что это происходит, когда процесс работает через операторы печати к окну сообщений. Я хотел бы смочь видеть сообщение каждый раз, когда ценность дня удалений фиксируется. Там какой-либо путь состоит в том, чтобы сделать что-то вроде этого? Процедура примерно размечается как это:

WHILE EXISTS(<query statement>)
BEGIN

BEGIN TRAN

DELETE
FROM  <table>
WHERE <condition>
AND <condition>

--need some sort of "rows affected" statement here

COMMIT

END
6
задан Kevin 15 January 2010 в 14:57
поделиться

4 ответа

К сожалению, вывод оператора печати устанавливается вверх и не записывается на выход сразу. Way Work Это предназначено для использования RaisError, как это:

RAISERROR ('MY MESSAGE', 0, 1) WITH NOWAIT

, специально для того, что вы хотите:

    DECLARE @Msg VARCHAR(200)

    WHILE EXISTS(<query statement>)
    BEGIN
    BEGIN TRAN

    DELETE
    FROM  <table>
    WHERE <condition>
    AND <condition>

    SELECT @Msg = CAST(@@ROWCOUNT AS VARCHAR(10)) + ' rows affected'
    RAISERROR (@Msg, 0, 1) WITH NOWAIT

    COMMIT
    END

Я также склонен включать текущее время в сообщении, поэтому я могу записать прогресс в течение времени.

23
ответ дан 8 December 2019 в 04:52
поделиться

К сожалению, вывод инструкции PRINT выполняется без немедленной записи в выходной документ. Способ обойти это - использовать RAISERROR так:

RAISERROR ('MY MESSAGE', 0, 1) WITH NOWAIT

В частности, для того, что вы хотите:

    DECLARE @Msg VARCHAR(200)

    WHILE EXISTS(<query statement>)
    BEGIN
    BEGIN TRAN

    DELETE
    FROM  <table>
    WHERE <condition>
    AND <condition>

    SELECT @Msg = CAST(@@ROWCOUNT AS VARCHAR(10)) + ' rows affected'
    RAISERROR (@Msg, 0, 1) WITH NOWAIT

    COMMIT
    END

Я также склонен включать текущее время в сообщение, чтобы я мог записывать прогресс по времени.

-121--4121328-

Из документации Edit Control :

Длина текста, который можно ввести можно ограничить, поставив число от 0 до 2147483646 в фигурных скобках в начале текстового поля в таблица Control. Например, если текстовое поле начинается с {80}, длина последовательности ограничена 80 персонажи. Если такой лимит отсутствует в таблице, или если 0 указано, длина установлена в максимально возможное (2147483646 персонажи. Отрицательный или нечисловой значение создаст ошибку.

-121--4817928-

Что-нибудь более сложное, чем select @ @ rowcount?

2
ответ дан 8 December 2019 в 04:52
поделиться

Я имел обыкновение делать что-то подобное на это, и потому что отпечатки, где усушивают, не так много использовали, однако я обнаружил, что утилита командной строки osql Немедленно выводит их, поэтому я написал сохраненное proc и вместо этого позвонил его из пакетного файла, что позволит мне увидеть прогресс.

0
ответ дан 8 December 2019 в 04:52
поделиться

Как насчет использования пункта OUTPUT?? Можете ли вы писать в консоль SQL Server из хранимого proc?

Как и в триггере, у вас в руках псевдо-таблица "Deleted", содержащая удаляемые строки со всеми их столбцами.

WHILE EXISTS(<query statement>)
BEGIN
  BEGIN TRAN

  DELETE FROM  <table>
  OUTPUT deleted.ID, deleted.TimeStamp -- or whatever
  WHERE <condition>
  AND <condition>

  COMMIT

END
0
ответ дан 8 December 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: