2011-06-06 62 views
1

遷移類別我想這樣做使用SQL OUTPUT

DECLARE @idTable TABLE 
(
    hierakiId INT, 
    katId INT 
); 

DECLARE @id int 
SET @id = (SELECT MIN([ID]) FROM [Hieraki] WHERE Navn = 'Sagsskabeloner') 

INSERT INTO HierakiMedlem(Navn, HierakiID) 
OUTPUT INSERTED.ID, s.ID INTO @idTable 
SELECT s.Navn, @id, s.ID FROM SagSkabelonKategori s 

UPDATE s SET s.HierakiMedlem = @idTable.hierakiId 
FROM SagSkabelon s INNER JOIN @idTable 
ON s.SagSkabelonKategoriID = @idTable.katId 

導致@idTable映射,映射老每個類別的新身份,以便需要時我可以改變引用。很明顯,這會導致錯誤(第3行),因爲SELECT導致的列多於INSERT INTO使用的列。

有關最乾淨的方法的任何建議嗎?


我的SQL Server 2005。

/編輯


現在W¯¯上。完整的源代碼。

我們正在從半平面非嵌套類別排序切換到基於層次結構的類別排序。所有類別都將作爲新層次中的根級別節點進行復制,並且每個類別的前一個成員必須具有引用新創建的根節點的新字段集合。

我想做什麼; 1.將所有類別複製到層次表中,將它們的父級(HierakiID)設置爲相同的值。

  1. 更新所有引用類別的列,以便他們現在(也)引用層次結構。

  2. 刪除引用類

  3. 刪除類別

棘手的問題對我來說是獲得類別ID和層次結構ID之間的映射。

/編輯

+0

您可以使用'merge'而不是'insert'。看這裏http://stackoverflow.com/questions/5365629/using-merge-output-to-get-mapping-between-source-id-and-target-id和這裏http://stackoverflow.com/questions/6174355/how-to-copy-tables-avoid-cursors-in-sql/6174409#6174409 – 2011-06-06 13:14:44

+0

可悲的是沒有可能性。忘了提及我在SQL Server 2005上。 – hhravn 2011-06-06 13:53:22

回答

0

在INSERT語句輸出只能從插入表中的項目列。而你的SELECT必須與INSERT匹配。假設HierakiMedlem.ID是一個生成的標識值,那麼你可以試試:

INSERT INTO HierakiMedlem(Navn, HierakiID) 
OUTPUT INSERTED.ID, INSERTED.HierakiID 
    INTO @idTable (ID, HierakiID) 
SELECT s.Navn, s.ID 
FROM SagSkabelonKategori s 

你的後續更新使用的列名狀@idTable.katId這是不可能的,我猜測它的意思是。所以很可能我的答案不會直接編譯,但如果您想要正確的答案,您應該始終包含表格的定義(包括表格變量)。

+0

抱歉。更新了帖子。 – hhravn 2011-06-07 06:53:09