#sql #sql-server #sql-server-2005
#sql #sql-сервер #sql-server-2005
Вопрос:
Я пытаюсь удалить большое количество строк из таблицы и в то же время избежать слишком большого размера журнала транзакций. Похоже, что большинство людей в Интернете рекомендуют использовать инструкцию BEGIN TRAN / COMMIT TRAN. Я на самом деле не эксперт по SQL, поэтому я просто попытался перевести phseudocode в ms sql (SQL Server 2005). Вот код:
set rowcount 1000
while (1=1)
BEGIN
with MonthEndDates as (
select max(Rundate) MonthEnd
from table3
group by convert(varchar(6), RunDate, 112))
begin transaction T1
delete from table1 where
table2id in
(select table2id from table2 where
table3id in
(select table3id from table3
where RunDate < getdate()-30
and RunDate not in (select MonthEnd from MonthEndDates)))
commit transaction T1
if @@rowcount = 0
break
END
set rowcount 0
Правильно ли я вообще это делаю? Если да, то почему я получаю эту ошибку: неправильный синтаксис рядом с ключевым словом ‘begin’. Я также попытался удалить метки транзакций, но это не помогло
Как я уже сказал, я не силен в SQL, поэтому буду признателен за любую помощь
Спасибо
Комментарии:
1.
begin transaction T1
Нужно было бы идти передWITH
и заканчиваться точкой с запятой.2. Спасибо Мартину за такой качественный ответ. Теперь это работает!
Ответ №1:
set rowcount 1000
while (1=1)
BEGIN
begin transaction T1
--The CTE goes with the DELETE
;with MonthEndDates as (
select max(Rundate) MonthEnd
from table3
group by convert(varchar(6), RunDate, 112))
delete from table1 where
table2id in
(select table2id from table2 where
table3id in
(select table3id from table3
where RunDate < getdate()-30
and RunDate not in (select MonthEnd from MonthEndDates)));
commit transaction T1
if @@rowcount = 0
break
END
set rowcount 0