2017-07-31 65 views
0

的我來到這裏相當於一箇中型清理查詢也不過是DELETE陳述15行左右。我注意到,最後幾行,有時會由於FK參考約束,但是當我重新運行該查詢,剩餘的數據被刪除。我的研究讓我相信這是一個時間問題。每個語句後我卻無法添加GO,因爲我的變量失去範圍...同步多個delete語句,而無需使用「GO」關鍵字

DECLARE @userOrders TABLE(OrderId INT) 
DECLARE @userInventoryCatalog TABLE(InventoryId INT) 
DECLARE @userSpotCheckRequests TABLE(SpotCheckRequestId INT) 

INSERT INTO @userOrders 
SELECT OrderId FROM [Order] WHERE UserId = @userId 

INSERT INTO @userInventoryCatalog 
SELECT InventoryId FROM [Inventory] WHERE UserId = @userId 

INSERT INTO @userInventoryCatalog 
SELECT SpotCheckRequestId FROM SpotCheckRequest WHERE InventoryId IN (SELECT 
* FROM @userInventoryCatalog) 

DELETE FROM ClientCustomerNotes WHERE ClientCustomerId IN (SELECT 
ClientCustomerId FROM ClientCustomers WHERE UserId = @userId) 
DELETE FROM InventoryShelveMapping WHERE InventoryId IN (SELECT * FROM 
@userInventoryCatalog) 
DELETE FROM UserBinAllocationLog WHERE UserId = @userId 
DELETE FROM OrderMantoxTeaInventory WHERE MantoxTeaInventoryId IN (SELECT * 
FROM @userInventoryCatalog) 
DELETE FROM InventoryLog WHERE InventoryId IN (SELECT * FROM 
@userInventoryCatalog) 
DELETE FROM Analytics WHERE UserId = @userId 
DELETE FROM SpotCheckRequestItems WHERE SpotCheckRequestId IN (SELECT * FROM 
@userSpotCheckRequests) 
DELETE FROM SpotCheckRequest WHERE InventoryId IN (SELECT * FROM 
@userInventoryCatalog) 
DELETE FROM UserNonReturnableItems WHERE InventoryId IN (SELECT * FROM 
@userInventoryCatalog) 
DELETE FROM InventoryBundleDefinition WHERE InventoryId IN (SELECT * FROM 
@userInventoryCatalog) 
DELETE FROM Inventory WHERE UserId = @userId 
DELETE FROM [Log] WHERE OrderId IN (SELECT * FROM @userOrders) 
DELETE FROM OrderTracking WHERE OrderId IN (SELECT * FROM @userOrders) 
DELETE FROM OrderProperties WHERE OrderId IN (SELECT * FROM @userOrders) 
DELETE FROM OrderDimensions WHERE OrderId IN (SELECT * FROM @userOrders) 
DELETE FROM OrderAttachments WHERE OrderId IN (SELECT * FROM @userOrders) 
DELETE FROM OrderPicker WHERE OrderId IN (SELECT * FROM @userOrders) 
DELETE FROM OrderZenDesk WHERE OrderId IN (SELECT * FROM @userOrders) 
DELETE FROM OrderReprocessingQueue WHERE OrderId IN (SELECT * FROM 
@userOrders) 
DELETE FROM OrderPicker WHERE OrderId IN (SELECT * FROM @userOrders) 
DELETE FROM OrderInformation WHERE OrderId IN (SELECT * FROM @userOrders) 
DELETE FROM [Notification] WHERE UserId = @userId 
DELETE FROM [TransactionPaymentLog] WHERE UserId = @userId 
DELETE FROM [TransactionLog] WHERE UserId = @userId 
DELETE FROM [Order] WHERE UserId = @userId 
DELETE FROM UserContacts WHERE UserId = @userId 
DELETE FROM ClientCustomers WHERE UserId = @userId 

所以我的問題是:
我怎樣才能確保多條語句同步運行?

+0

你確定表是按正確的順序,以避免外鍵的問題正在處理?是否有可能引發問題的觸發器,例如更新日誌表? SQL Server將按順序依次執行這些語句。 (你沒有標籤的問題爲適用於一個特定的數據庫。)有27'DELETE'陳述,除「15個左右的」有點多。 – HABO

+0

對不起。它是MS SQL。任何一個我眼睛揉成一個嘿嘿。但是沒有沒有觸發器。我相信他們正在正常處理,因爲這曾經工作。它隨機失敗。似乎越多的數據越有可能失敗。當我第一次把這個當時只有幾百行來測試,現在有成千上萬的,它唯一的,現在這個問題已經穆斯特起來的。 – Adrian

回答

0

更改isolation level並設置交易並執行delete聲明。這將確保沒有更新的值,當你在刪除工作,使delete發生同步。

set transaction isolation level repeatable read BEGIN transaction DELETE Statements.... COMMIT transaction

您還可以閱讀more about isolation levels