我需要将一个表的最后插入的标识值插入到另一个表中, 我的数据库命中率非常高,因此没有标识插入的批量插入会导致完整性问题。
表格结构:
CREATE TABLE tbl_tag_rule
(
tag_rule_id BIGINT IDENTITY(1,1) PRIMARY KEY,
version_batchid BIGINT,
tag_id BIGINT,
rule_id BIGINT
)
CREATE TABLE tbl_version
(
version_id BIGINT IDENTITY(1,1) PRIMARY KEY
version_batchid BIGINT,
version_name NVARCHAR(255),
tag_rule_id BIGINT
)
我会将以下xml值传递给sp。
'<root>
<record version_batchid ="1" version_name="Apple">
<item tag_id="1" rule_id="1"></item>
<item tag_id="2" rule_id="2"></item>
<item tag_id="3" rule_id="3"></item>
<item tag_id="4" rule_id="4"></item>
</record>
</root>'
预期输出:
+-------------+-----------------+--------+---------+
| tag_rule_id | version_batchid | tag_id | rule_id |
+-------------+-----------------+--------+---------+
| 1 | 1 | 1 | 1 |
| 2 | 1 | 2 | 2 |
| 3 | 1 | 3 | 3 |
| 4 | 1 | 4 | 4 |
+-------------+-----------------+--------+---------+
+------------+-----------------+--------------+-------------+
| version_id | version_batchid | version_name | tag_rule_id |
+------------+-----------------+--------------+-------------+
| 1 | 1 | Apple | 1 |
| 2 | 1 | Apple | 2 |
| 3 | 1 | Apple | 3 |
| 4 | 1 | Apple | 4 |
+------------+-----------------+--------------+-------------+
目前我正在使用while循环来完成此操作。有没有其他方法可以在没有while循环的情况下插入,
答案 0 :(得分:0)
使用这样的查询,您可以将所有需要的数据放入声明的表变量中:从那里插入两个表应该很容易。您可以使用SET IDENTITY_INSERT tableName ON
并插入并添加SELECT MAX(id)+1
,或者您可以使用UPDATE语句将拟合ID写回@tbl
变量...
DECLARE @tbl TABLE(tbl_rule_id INT,VersionBatchID INT, VersionName VARCHAR(100),tag_id INT,rule_id INT)
INSERT INTO @tbl
SELECT ROW_NUMBER() OVER(ORDER BY One.Item.value('@tag_id','int')) AS tbl_rule_id
,@x.value('(/root/record)[1]/@version_batchid','int') AS VersionBatchID
,@x.value('(/root/record)[1]/@version_name','varchar(max)') AS VersionName
,One.Item.value('@tag_id','int') As tag_id
,One.Item.value('@rule_id','int') As rule_id
FROM @x.nodes('/root/record/item') AS One(Item);
SELECT * FROM @tbl;
结果:
tbl_rule_id VersionBatchID VersionName tag_id rule_id
1 1 Apple 1 1
2 1 Apple 2 2
3 1 Apple 3 3
4 1 Apple 4 4
编辑:一种如何进行插入的方法,但肯定需要适应多个插入:
SET IDENTITY_INSERT tbl_tag_rule ON;
INSERT INTO tbl_tag_rule(tag_rule_id,version_batchid,tag_id,rule_id)
SELECT tbl_rule_id,VersionBatchID,tag_id,rule_id
FROM @tbl;
SET IDENTITY_INSERT tbl_tag_rule OFF;
SELECT * FROM tbl_tag_rule;
SET IDENTITY_INSERT tbl_version ON;
INSERT INTO tbl_version(version_id,version_batchid,version_name,tag_rule_id)
SELECT tbl_rule_id,VersionBatchID,VersionName,rule_id
FROM @tbl
SET IDENTITY_INSERT tbl_version OFF;
SELECT * FROM tbl_version