【发布时间】:2014-06-25 16:16:37
【问题描述】:
tl;dr
使用 SQLServer 2005(我们支持的最低版本),是否可以在不使用游标的情况下从链接表中复制数据?
详情
我有两张表,大致结构如下...
dbo.[ParentTable]
[ItemId] [UserId] [Details]
1 1 'One'
2 1 'Two'
dbo.[ChildTable]
[ChildId] [ItemId] [Details]
1 1 'One A'
2 1 'One B'
3 2 'Two A'
4 2 'Two B'
ParentTable.ItemId 是具有身份 (1,1) 的 PKChildTable.ChildId 是具有身份 (1,1) 的 PKChildTable.ItemId 是 ParentTable.ItemId 的 FK
目前,如果我需要将UserId=1 的所有数据复制到UserId=2,我必须执行以下操作...
DECLARE @ItemId INT, @NewItemId INT
DECLARE [ParentCursor] CURSOR FOR
SELECT [ItemId]
FROM [ParentTable]
WHERE [UserId] = 1
OPEN [ParentCursor]
FETCH NEXT FROM [ParentCursor] INTO @ItemId
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO [ParentTable] ([UserId], [Details])
SELECT 2, [Details]
FROM [ParentTable]
WHERE [ItemId] = @ItemId
SET @NewItemId = @@IDENTITY
INSERT INTO [ChildTable] ([ItemId], [Details]
SELECT @NewItemId, [Details]
FROM [ChildTable]
WHERE [ItemId] = @ItemId
FETCH NEXT FROM [ParentCursor] INTO @ItemId
END
CLOSE [ParentCursor]
DEALLOCATE [ParentCursor]
这实现了...的预期结果
dbo.[ParentTable]
[ItemId] [UserId] [Details]
1 1 'One'
2 1 'Two'
3 2 'One'
4 2 'Two'
dbo.[ChildTable]
[ChildId] [ItemId] [Details]
1 1 'One A'
2 1 'One B'
3 2 'Two A'
4 2 'Two B'
5 3 'One A'
6 3 'One B'
7 4 'Two A'
8 4 'Two B'
有没有更简单的不使用光标的方法?
(注意,我已经尝试创建一个http://sqlfiddle.com,但我根本无法让它正确使用光标。与分隔符有关,但我无法弄清楚。)
【问题讨论】:
标签: sql-server tsql sql-server-2005 cursor