我想做点什么
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)设置为相同的值。
更新所有类别引用中的列,以便它们现在(也)引用层次结构节点。
删除对类别的引用
删除类别
/编辑
答案 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
之类的列名称,这对我来说无法猜测它的意义。所以很可能我的答案不能直接编译,但如果你想要一个正确的答案,你应该总是包括你的表的完全定义(包括表变量)。