22,294
社区成员
发帖
与我相关
我的任务
分享CREATE TABLE emp(eid INT IDENTITY(1,1),eName nVARCHAR(50))
CREATE TABLE dep(did INT IDENTITY(1,1),dName nVARCHAR(50))
CREATE TABLE erd(did INT,eid INT)
GO
INSERT dep SELECT N'X' UNION ALL SELECT N'Y' UNION ALL SELECT N'Z'
--INSERT emp SELECT N'a' UNION ALL SELECT N'b' UNION ALL SELECT N'c' UNION ALL SELECT N'd' UNION ALL SELECT N'e'
GO
SELECT * FROM emp
SELECT * FROM dep
SELECT * FROM erd
GO
CREATE TABLE info(gid INT,uid INT IDENTITY(1,1))
GO
CREATE PROC p
--注意这里我的oldid,newid的顺序与你的是反的,看数据时注意一下就可以了。
@newid INT,@oldid INT,@ids VARCHAR(1000)
AS
BEGIN
DELETE a FROM erd a
INNER JOIN
(SELECT id FROM
(SELECT x = CAST('<r>' + REPLACE(@ids,',','</r><r>') + '</r>' AS XML)) a
CROSS APPLY
(SELECT id=t.x.value('.','int') FROM a.x.nodes('//r') AS t(x)) b
) b
ON a.eid = b.id AND a.did = @oldid
INSERT erd SELECT @newid,b.id
FROM
(SELECT x = CAST('<r>' + REPLACE(@ids,',','</r><r>') + '</r>' AS XML)) a
CROSS APPLY
(SELECT id=t.x.value('.','int') FROM a.x.nodes('//r') AS t(x)) b
WHERE NOT EXISTS(SELECT 1 FROM erd WHERE eid=b.id) AND @newid!=0
END
GO
DECLARE @uid INT,@gid INT
SET @gid=3
INSERT info(gid) SELECT @gid
SET @uid = SCOPE_IDENTITY()
EXEC p @gid,0,@uid
SELECT * FROM emp
SELECT * FROM info
SELECT * FROM erd
/*
3 1
没有问题
*/
GO
DROP TABLE emp,dep,erd ,info
GO
DROP PROC p
GO