如何在没有while循环的情况下识别insert?

时间:2015-12-17 13:49:54

标签: sql sql-server xml sql-server-2008 identity

我需要将一个表的最后插入的标识值插入到另一个表中, 我的数据库命中率非常高,因此没有标识插入的批量插入会导致完整性问题。

表格结构:

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循环的情况下插入,

1 个答案:

答案 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