У меня есть хранимая процедура, работающая на цикличном выполнении 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
К сожалению, вывод оператора печати устанавливается вверх и не записывается на выход сразу. 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
Я также склонен включать текущее время в сообщении, поэтому я могу записать прогресс в течение времени.
К сожалению, вывод инструкции 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 :
-121--4817928-Длина текста, который можно ввести можно ограничить, поставив число от 0 до 2147483646 в фигурных скобках в начале текстового поля в таблица Control. Например, если текстовое поле начинается с {80}, длина последовательности ограничена 80 персонажи. Если такой лимит отсутствует в таблице, или если 0 указано, длина установлена в максимально возможное (2147483646 персонажи. Отрицательный или нечисловой значение создаст ошибку.
Что-нибудь более сложное, чем select @ @ rowcount?
Я имел обыкновение делать что-то подобное на это, и потому что отпечатки, где усушивают, не так много использовали, однако я обнаружил, что утилита командной строки osql
Немедленно выводит их, поэтому я написал сохраненное proc и вместо этого позвонил его из пакетного файла, что позволит мне увидеть прогресс.
Как насчет использования пункта 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