你基本上只需要一個表來映射你的舊/新值,物理表,如果你想將這些資料保存的記錄,一個臨時表,如果你沒有。
-- Create Tables
CREATE TABLE #one (oneid UNIQUEIDENTIFIER)
CREATE TABLE #two (twoid UNIQUEIDENTIFIER, oneid UNIQUEIDENTIFIER)
CREATE TABLE #three (threeid UNIQUEIDENTIFIER, twoid UNIQUEIDENTIFIER)
CREATE TABLE #four (fourid UNIQUEIDENTIFIER, threeid UNIQUEIDENTIFIER)
-- Insert test data
DECLARE @guid UNIQUEIDENTIFIER
SET @guid = newid()
insert #one values (@guid)
INSERT #two select NEWID(), oneid from #one
INSERT #two select NEWID(), oneid from #one
INSERT #two select NEWID(), oneid from #one
INSERT #three SELECT NEWID(), twoid FROM #two WHERE oneid = @GUID
INSERT #three SELECT NEWID(), twoid FROM #two WHERE oneid = @GUID
INSERT #three SELECT NEWID(), twoid FROM #two WHERE oneid = @GUID
INSERT #four SELECT NEWID(), threeid FROM #three WHERE twoid IN (SELECT twoid FROM #two WHERE oneid = @GUID)
INSERT #four SELECT NEWID(), threeid FROM #three WHERE twoid IN (SELECT twoid FROM #two WHERE oneid = @GUID)
INSERT #four SELECT NEWID(), threeid FROM #three WHERE twoid IN (SELECT twoid FROM #two WHERE oneid = @GUID)
-- Create temp tables
CREATE TABLE #tempone (oneid UNIQUEIDENTIFIER, oldval UNIQUEIDENTIFIER)
CREATE TABLE #temptwo (twoid UNIQUEIDENTIFIER, oneid UNIQUEIDENTIFIER, oldval UNIQUEIDENTIFIER)
CREATE TABLE #tempthree (threeid UNIQUEIDENTIFIER, twoid UNIQUEIDENTIFIER, oldval UNIQUEIDENTIFIER)
CREATE TABLE #tempfour (fourid UNIQUEIDENTIFIER, threeid UNIQUEIDENTIFIER, oldval UNIQUEIDENTIFIER)
INSERT #tempone SELECT NEWID(), oneid FROM #one WHERE oneid = @guid
INSERT #temptwo SELECT NEWID(), #tempone.oneid, #two.twoid FROM #two JOIN #tempone ON #two.oneid = #tempone.oldval
INSERT #tempthree SELECT NEWID(), #temptwo.twoid, #three.threeid FROM #three JOIN #temptwo ON #three.twoid = #temptwo.oldval
INSERT #tempfour SELECT NEWID(), #tempthree.threeid, #four.fourid FROM #four JOIN #tempthree ON #four.threeid = #tempthree.oldval
-- INSERT results
INSERT #one SELECT t.oneid /*#one.column_list*/ FROM #tempone t JOIN #one oldT ON t.oldval = oldT.oneid
INSERT #two SELECT t.twoid, t.oneid /*#two.column_list*/ FROM #temptwo t JOIN #two oldT ON t.oldval = oldT.twoid
INSERT #three SELECT t.threeid, t.twoid /*#three.column_list*/ FROM #tempthree t JOIN #three oldT ON t.oldval = oldT.threeid
INSERT #four SELECT t.fourid, t.threeid /*#four.column_list*/ FROM #tempfour t JOIN #four oldT ON t.oldval = oldT.fourid
-- View Results
SELECT one.oneid, two.twoid, three.threeid, four.fourid
FROM #one one
JOIN #two two ON one.oneid = two.oneid
JOIN #three three on three.twoid = two.twoid
JOIN #four four on four.threeid = three.threeid
ORDER BY one.oneid, two.twoid, three.threeid, four.fourid
我會做一個存儲過程。事實上,在使用存儲過程之前,我實現了這樣的功能。不過,我不會使用遊標。 W/O的細節很難說,但我想你可以做一些'插入...'並且爲每個表格複製所有內容。 – Icarus
我一直在努力的部分是,當我插入'Two'時,如何獲得新的/舊的TwoID值以準確更新'Three'? – Fermin