使用SQL OUTPUT迁移类别

时间:2011-06-06 12:58:05

标签: sql sql-server

我想做点什么

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. 删除类别

  4. 对我来说,棘手的部分是在类别ID和层次结构ID之间获得一个映射。

    /编辑

1 个答案:

答案 0 :(得分:0)

在INSERT语句中,OUTPUT只能从INSERTED表中投影列。并且您的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之类的列名称,这对我来说无法猜测它的意义。所以很可能我的答案不能直接编译,但如果你想要一个正确的答案,你应该总是包括你的表的完全定义(包括表变量)。