2012-03-11 6 views
0

Я пытаюсь написать UPDATE SQL Query, чтобы очистить мою базу данных немного ...SQL 2005 Update Query

Вот что я пытался, но это было создать огромные проблемы для меня, и в конечном итоге не почитая все мои WHEREs, который изменил записи, которые не должны были быть изменены ...

UPDATE Orders 
SET Orders.OrderStatus = Cancelled 
WHERE Orders.OrderStatus in (New,Pending,Processing,Payment Declined,Awaiting Payment,See Line Items,See Order Notes,Backordered) 
AND Orders.Total_Payment_Received = 0 

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

AND Orders.OrderDate BETWEEN DATEADD(Day, -60, GetDate()) 

Таким образом, должны быть затронуты только записи с OrderDate старше шестидесяти дней.

Если кто-нибудь может помочь мне составить запрос, который будет работать, было бы весьма признателен ...

ответ

0

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

Если вы хотите записи старше 60 дней ...

and Orders.OrderDate < dateadd(day, -60, getdate()) 

Однако, поскольку GETDATE() включает в себя время, вы, вероятно, хотите, чтобы считать, что из рассмотрения ...

and Orders.OrderDate < dateadd(day, -60, convert(char(10), getdate(), 101)) 

Функция преобразования в этом случае удаляет временную часть даты.

Кроме того, если ваши статусы заказов должны быть строками, то они должны быть окружены кавычками, так что ваш полный запрос будет выглядеть следующим образом:

UPDATE Orders 
SET Orders.OrderStatus = 'Cancelled' 
WHERE Orders.OrderStatus in ('New','Pending','Processing','Payment Declined','Awaiting Payment','See Line Items','See Order Notes','Backordered') 
AND Orders.Total_Payment_Received = 0 
AND Orders.OrderDate < dateadd(day, -60, convert(char(10), getdate(), 101)) 

слово советов о запущенных обновлениях. ВСЕГДА запускайте SELECT с тем же предложением WHERE, чтобы вы могли определить, какие строки будут затронуты. Это сэкономит вам много боли. Если слишком много строк, которые необходимо обновить, используйте SELECT TOP 5000 или что-то, чтобы вы могли хотя бы проверить некоторые из них. Всегда знайте, что именно вы собираетесь обновлять, прежде чем обновлять его.

+0

Весь запрос испорчен ... Я продолжаю получать ошибки при попытке выполнить его, я не могу понять, что не так с этим запросом ... – henryaaron

+0

Измените свой вопрос, чтобы показать весь запрос, и скажите нас, какие ошибки вы получаете. В противном случае мы не сможем помочь. –

+0

Это весь запрос, который я выполняю ... он просто говорит о внутренней ошибке сервера 500 – henryaaron

0

Если вы хотите, чтобы дата вашего заказа была между today's date and 60 days before, вы должны сделать следующее.

WHERE start_date BETWEEN dateadd(day,-60,getdate()) AND getdate(); 
0

Используйте анализатор запросов и создайте представление заказов, которые вы хотите отменить. Взгляды потрясающие. С представлениями вы можете построить подмножество данных по одной части за раз, проверяя, как ваш взгляд содержит правильный поднабор данных. Например:

Начните с создания под названием viewOrdersToCancel, который показывает все заказы с Total_Payment_Received = 0. (Это делается путем ввода = 0 в колонке фильтра)

сделать SELECT * FROM viewOrdersToCancel, чтобы увидеть только те записи.

Затем измените представление и добавьте OrderDate между критериями DateAdd (d, -60, GetDate()), GetDate()).

Сделайте еще один ВЫБЕРИТЕ * FROM viewOrdersToCancel, чтобы увидеть только те записи.

Теперь измените вид, добавив различные значения OrderStatus внутри предложения in.

Ваше мнение теперь содержит подмножество Заказов, которые вы хотите установить на «Отменено»

Просто запустите оператор обновления с внутренним соединением:
(Это предполагает, у вас есть уникальная OrderId)

UPDATE Orders 
SET OrderStatus = 'Cancelled' 
FROM Orders t1 
INNER JOIN viewOrdersToCancel t2 
ON t1.OrderId = t2.OrderId