我有一個SQL Server數據庫,我需要手動執行更新查詢。有沒有解決方案可以使用任何編程語言(可以使用存儲過程)SQL Server更新與WHERE跨越2個表
我有4個表影響(/使用)在查詢中。
- [常規]
- [StatusHistoryForOrder]
- [StatusHistory]
- [以下狀態]
我需要更新的字段[常規]。[OrderStatusID]這是一個國外[狀態]鍵。 (因此,實際上改變順序的狀態。表[StatusHistoryForOrder]爲連接表[StatusHistory]和只包含2個colums。
- [StatusHistoryForOrder] [單編號]
- [StatusHistoryForOrder]。[ OrderStatusHistoryid]
不要說這在邏輯上不是因爲我已經知道了。誰設計的數據庫,該公司是一個完整的智障公司,但現在該數據庫太大,直設置的東西,既不存在的時間或金錢去做。
的〔StatusHistory]表具有多個列:
- [StatusHistory] [OrderStatusHistoryId]
- [StatusHistory] [OrderStatusId]
- [StatusHistory] [日期]
- [StatusHistory]。 [Message]
[StatusHistory]。[OrderStatusId]也是[Statuses]的外鍵。
在更新查詢中,我需要將訂單的狀態更新爲狀態16.但是僅限於現在具有狀態1且比60天更早的行。我知道我可以使用函數檢查日期
DATEDIFF(DD,[StatusHistory].[Date],GETDATE()) > 60
但是,如果日期字段不在訂單中,如何實現此查詢。爲了設置新的[StatusHistory],必須爲該表創建一個新行,並且[StatusHistoryForOrder]表還需要一個新行,並且需要在[Orders]錶行中設置該行的ID。
有誰知道如何做到這一點?我對SQL Server(或者SQL)相當陌生,而且絕對不知道從哪裏開始。
結論:
我需要一個存儲過程,首先檢查在[常規]中的每一行,如果[StatusHistory] [日期](鏈接到使用外鍵的順序),該命令的是較舊的那60.如果它比較老,那麼必須插入一個新的StatusHistory行,其當前日期和狀態爲16.然後在[StatusHistoryForOrder]中必須插入一個新行,並在[StatusHistoryForOrder]中設置了statusHistory的新ID。[OrderStatusHistoryid]和[StatusHistoryForOrder]。[OrderId]中設置的訂單ID。最後但並非最不重要的是:[訂單]。[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)
UPDATE 對於@marc_s:
任何人都可以幫助我嗎?
@marc_s Microsoft SQL Server 2008 R2。使用WPI安裝。還使用:SQL Server Management Studio – SynerCoder 2011-03-16 09:08:22
您是否有業務層? – 2011-03-16 09:40:39
@Stefan Steinegger ,,我不知道你在說什麼。就像我說的,我對此很新。 – SynerCoder 2011-03-16 10:40:18