Неправильный синтаксис рядом с ключевым словом ‘begin’

#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