У меня есть база данных SQL Server, и мне нужно вручную выполнить запрос на обновление. Никакие решения, использующие какой-либо язык программирования, не могут быть использованы. (Можно использовать хранимые процедуры)
У меня 4 таблицы затронуты (/ использованы) в запросе.
- [Заказы]
- [StatusHistoryForOrder]
- [StatusHistory]
- [Статусы]
Мне нужно обновить поле [Заказы]. [OrderStatusID], которое является внешним ключом для [Статусы]. (Таким образом, фактически изменяется состояние заказа. Таблица [StatusHistoryForOrder] является таблицей связывания с [StatusHistory] и содержит только 2 столбца.
- [StatusHistoryForOrder]. [OrderId]
- [StatusHistoryForOrder]. [OrderStatusHistoryid]
Не говорите, что это не логично, потому что я это уже знаю. Компания, которая разработала базу данных, является полностью отсталой компанией, но база данных теперь слишком велика, чтобы все исправить, и нет ни времени, ни денег для этого.
Таблица [StatusHistory] состоит из нескольких столбцов:
- [StatusHistory]. [OrderStatusHistoryId]
- [StatusHistory]. [OrderStatusId]
- [StatusHistory]. [Дата]
- [StatusHistory]. [Сообщение]
[StatusHistory]. [OrderStatusId] также является внешним ключом для [Статусы].
В запросе на обновление мне нужно обновить статус заказа до статуса 16. Но только для строк, которые теперь имеют статус 1 и старше 60 дней. Я знаю, что могу проверить дату с помощью функции
DATEDIFF(DD,[StatusHistory].[Date],GETDATE()) > 60
Но как реализовать этот запрос, если поля даты нет в заказах. И чтобы установить новую [StatusHistory], необходимо создать новую строку для этой таблицы, а для таблицы [StatusHistoryForOrder] также требуется новая строка, и идентификатор этой строки должен быть установлен в строке таблицы [Заказы].
Кто-нибудь знает как это сделать? Я новичок в SQL Server (или SQL, если на то пошло), и я абсолютно не знаю, с чего начать.
Вывод:
Мне нужна хранимая процедура, которая сначала проверяет каждую строку в [Заказы], если [StatusHistory]. [Date] (который связан с заказом с помощью внешних ключей) этого заказа старше 60. Если он старше, то создается новый StatusHistory строка должна быть вставлена с текущей датой и статусом 16. Затем в [StatusHistoryForOrder] должна быть вставлена новая строка с новым идентификатором statusHistory, установленным в [StatusHistoryForOrder]. [OrderStatusHistoryid], и идентификатором заказа, установленным в [StatusHistoryForOrder]. [Номер заказа]. И последнее, но не менее важное: для [Orders]. [OrderStatusID] также необходимо установить значение 16.
Запрос на выбор для выбора даты и статуса заказа:
SELECT TOP (100) PERCENT
dbo.Orders.OrderID,
dbo.Statuses.Description AS Status,
dbo.StatusHistory.Date
FROM
dbo.Orders
INNER JOIN
dbo.Statuses
ON
dbo.Orders.OrderStatusID = dbo.Statuses.StatusId
INNER JOIN
dbo.StatusHistoryForOrder
ON
dbo.Orders.OrderID = dbo.StatusHistoryForOrder.OrderId
INNER JOIN
dbo.StatusHistory
ON
dbo.StatusHistoryForOrder.OrderStatusHistoryid = dbo.StatusHistory.OrderStatusHistoryId
WHERE
(dbo.Statuses.StatusId = 1)
AND
(DATEDIFF(DD, dbo.StatusHistory.Date, GETDATE()) > 60)
ОБНОВЛЕНИЕ для @marc_s:

Кто-нибудь может мне с этим помочь?