Ich habe eine SQL Server-Datenbank und muss eine Aktualisierungsabfrage manuell durchführen. Es können keine Lösungen mit einer Programmiersprache verwendet werden (gespeicherte Verfahren können verwendet werden).
In der Abfrage sind 4 Tabellen betroffen (/verwendet).
- [Bestellungen]
- [StatusHistoryForOrder]
- [StatusHistory]
- [Zustände]
Ich muss das Feld [Orders].[OrderStatusID] aktualisieren, das ein Fremdschlüssel zu [Statuses] ist. (Der Status der Bestellung wird also tatsächlich geändert. Die Tabelle [StatusHistoryForOrder] ist eine Verknüpfungstabelle zu [StatusHistory] und enthält nur 2 Spalten.
- [StatusHistoryForOrder].[OrderId]
- [StatusHistoryForOrder].[OrderStatusHistoryid]
Sagen Sie nicht, dass das nicht logisch ist, denn das weiß ich schon. Das Unternehmen, das die Datenbank entworfen hat, ist ein völlig zurückgebliebenes Unternehmen, aber die Datenbank ist jetzt zu groß, um die Dinge in Ordnung zu bringen, und es gibt weder die Zeit noch das Geld, um es zu tun.
Die Tabelle [StatusHistory] hat mehrere Spalten:
- [StatusHistory].[OrderStatusHistoryId]
- [StatusHistory].[OrderStatusId]
- [StatusHistory].[Datum]
- [StatusHistory].[Nachricht]
Die [StatusHistory].[OrderStatusId] ist auch ein Fremdschlüssel zu [Statuses].
In der Aktualisierungsabfrage muss ich den Status des Auftrags auf Status 16 aktualisieren. Aber nur für Zeilen, die jetzt den Status 1 haben und älter als 60 Tage sind. Ich weiß, ich kann das Datum mit der Funktion
DATEDIFF(DD,[StatusHistory].[Date],GETDATE()) > 60
Aber wie kann diese Abfrage implementiert werden, wenn das Datumsfeld nicht in den Aufträgen enthalten ist? Und um die neue [StatusHistory] zu setzen, muss eine neue Zeile für diese Tabelle erstellt werden und die Tabelle [StatusHistoryForOrder] braucht auch eine neue Zeile und die ID dieser Zeile muss in der Tabellenzeile [Orders] gesetzt werden.
Weiß jemand, wie man das macht? Ich bin ziemlich neu in SQL Server (oder SQL für diese Angelegenheit) und ich habe absolut keine Ahnung, wo zu beginnen.
Schlussfolgerung:
Ich benötige eine gespeicherte Prozedur, die zunächst jede Zeile in [Orders] überprüft, wenn die [StatusHistory].[Date] (die mit der Bestellung über Fremdschlüssel verknüpft ist) dieser Bestellung älter als 60 ist. Wenn sie älter ist, muss eine neue StatusHistory-Zeile mit dem aktuellen Datum und Status 16 eingefügt werden. Dann muss in [StatusHistoryForOrder] eine neue Zeile mit der neuen ID der StatusHistory eingefügt werden, die in [StatusHistoryForOrder].[OrderStatusHistoryid] und der in [StatusHistoryForOrder].[OrderId] eingestellten Auftragsnummer festgelegt wurde. Und zu guter Letzt: Die [Orders].[OrderStatusID] muss ebenfalls auf 16 gesetzt werden.
Eine Select-Abfrage, um das Datum und den Status der Bestellung auszuwählen:
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)
UPDATE Für @marc_s:
Kann mir jemand dabei helfen?