我的数据库包含三个名为Object_Table和Data_Table的表Link_Table。链接表只包含两列,一个对象记录的标识和一个数据记录的标识。
Object_Table
Data_Table
Link_Table
我想从DATA_TABLE链接到一个给定对象标识的位置复制数据,并将相应的记录插入到Data_Table不同Link_Table的给定对象标识中。
DATA_TABLE
我 可以 通过选择一个表变量并通过为每次迭代进行两次插入来循环来做到这一点。
这是最好的方法吗?
编辑 :我想避免循环有两个原因,第一个是我很懒,循环/临时表需要更多的代码,更多的代码意味着更多的地方出错,第二个原因是对性能的关注。
我可以在一次插入中复制所有数据,但是如何让链接表链接到每条记录都有一个新 ID 的新数据记录?
以下使用表变量设置了我的情况。
DECLARE @Object_Table TABLE ( Id INT NOT NULL PRIMARY KEY ) DECLARE @Link_Table TABLE ( ObjectId INT NOT NULL, DataId INT NOT NULL ) DECLARE @Data_Table TABLE ( Id INT NOT NULL Identity(1,1), Data VARCHAR(50) NOT NULL ) -- create two objects '1' and '2' INSERT INTO @Object_Table (Id) VALUES (1) INSERT INTO @Object_Table (Id) VALUES (2) -- create some data INSERT INTO @Data_Table (Data) VALUES ('Data One') INSERT INTO @Data_Table (Data) VALUES ('Data Two') -- link all data to first object INSERT INTO @Link_Table (ObjectId, DataId) SELECT Objects.Id, Data.Id FROM @Object_Table AS Objects, @Data_Table AS Data WHERE Objects.Id = 1
感谢另一个将我指向 OUTPUT 子句的答案,我可以展示一个解决方案:
-- now I want to copy the data from from object 1 to object 2 without looping INSERT INTO @Data_Table (Data) OUTPUT 2, INSERTED.Id INTO @Link_Table (ObjectId, DataId) SELECT Data.Data FROM @Data_Table AS Data INNER JOIN @Link_Table AS Link ON Data.Id = Link.DataId INNER JOIN @Object_Table AS Objects ON Link.ObjectId = Objects.Id WHERE Objects.Id = 1
然而事实证明,由于以下错误,在现实生活中并不是那么简单
OUTPUT INTO 子句不能位于(主键、外键)关系的任一侧
我仍然可以OUTPUT INTO使用临时表,然后以正常插入完成。所以我可以避免我的循环,但我不能避免临时表。
OUTPUT INTO