不幸的是,據我所知,你不能使用OUTPUT子句直接鏈接,但this method (live runnable version),保證讓你實際上只刪除剛剛成爲孤兒的任何截圖行(而不是任何現有的孤兒):
-- SO3208939
CREATE TABLE #Screenshot (
Id bigint IDENTITY(100000, 10) NOT NULL
,Data varbinary(max) NULL
)
CREATE TABLE #Step (
Id bigint IDENTITY NOT NULL
,OccurredOn datetime NOT NULL
,ScreenshotId bigint NULL REFERENCES #Screenshot(Id)
)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('1/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('2/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('3/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('4/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('5/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('6/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('7/1/2010', @@IDENTITY)
INSERT INTO #Screenshot DEFAULT VALUES
INSERT INTO #Step VALUES ('8/1/2010', @@IDENTITY)
-- SELECT * FROM #Screenshot
-- SELECT * FROM #Step
DECLARE @Deleted AS TABLE (Id bigint NOT NULL)
UPDATE #Step
SET ScreenshotId = NULL
OUTPUT DELETED.ScreenshotId
INTO @Deleted
WHERE OccurredOn < DATEADD(dd, -30, GETDATE())
DELETE FROM #Screenshot
WHERE Id IN (SELECT Id FROM @Deleted)
-- SELECT * FROM #Step
SELECT * FROM #Screenshot
您可能有你的關係/外鍵字段在錯誤的表上。從你的解釋看來,也許你想在屏幕截圖上放置一個StepId字段,而不是在步驟表上放置一個ScreenShotId字段。 – Tahbaza 2010-07-09 00:13:14
這是一對一的關係,所以我想我可以做到這一點。你是說我應該這樣做,以便刪除它們更容易?或者改變關係還有其他好處嗎? – 2010-07-12 13:16:47