SQL 2005 Update Query - PullRequest
       26

SQL 2005 Update Query

0 голосов
/ 11 марта 2012

Я пытаюсь написать ОБНОВЛЕНИЕ SQL-запрос, чтобы немного очистить мою базу данных ...

Вот что я попробовал, но это создало для меня огромные проблемы и в итоге не выполнило все мои 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 старше шестидесяти дней.

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

Ответы [ 3 ]

0 голосов
/ 11 марта 2012

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

WHERE start_date BETWEEN dateadd(day,-60,getdate()) AND getdate();
0 голосов
/ 11 марта 2012

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

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

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

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

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

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

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

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

UPDATE Orders  
SET OrderStatus = 'Cancelled'  
FROM Orders t1  
INNER JOIN viewOrdersToCancel t2  
ON t1.OrderId = t2.OrderId
0 голосов
/ 11 марта 2012

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

Если вы хотите, чтобы записи были старше 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 или что-то еще, чтобы вы могли хотя бы проверить некоторые из них. Всегда точно знайте, что вы собираетесь обновить, прежде чем обновлять его.

...