【发布时间】:2011-05-30 09:15:15
【问题描述】:
我想在 SQL 中编写脚本,将这 2 个表(A,B)复制到其他 2 个表(C,D),相应地具有与 A,B 相同的结构。
重要提示:
- C、D 表不必须为空
- 多个进程可能同时调用脚本
表 A 有表 B 的外键(fk_a_b)
________________________ _________________
| Table A | | Table B |
|______________________| |_______________|
| id FK_A_B name | | id visible |
| ----- -------- ------| | ----- --------|
| 1 21 n1 | | 21 true |
| 5 32 n2 | | 32 false |
------------------------ -----------------
假设将表 B 复制到 D 后,这就是我得到的
________________
| Table D |
|______________|
| id visible |
| ----- -------|
| 51 true |
| 52 false |
----------------
现在,当我将表 A 复制到 C 时,我需要知道,ID=21 现在映射到 ID=51,ID=32 映射到 ID=52。最后,表 C 将是:
________________________
| Table C |
|______________________|
| id FK_C_D name |
| ----- -------- ------|
| 61 51 n1 |
| 62 52 n2 |
------------------------
由于多个进程可能同时调用脚本,我无法更改表 A、B 以添加一些辅助列。因此,为了实现这一点,我使用了 CURSOR。我逐行复制表B和托管临时表以将OldId映射到NewId(21->51,32->52),然后使用此临时表复制表A。
我听说 CURSOR 是不好的做法。那么,还有其他方法吗?
谢谢
【问题讨论】:
-
如果需要,您可以从源表中保留相同的标识值。你有什么理由要创建新的 id 吗?
-
@d-live,我写的那个表是 NOT 空的。源表中的标识值可以在目标表中使用
标签: sql sql-server tsql sql-server-2008 stored-procedures