如何使用openxml获取新插入行的ID?

Posted

技术标签:

【中文标题】如何使用openxml获取新插入行的ID?【英文标题】:how to get id of newly inserted rows using openxml? 【发布时间】:2012-06-02 19:00:06 【问题描述】:

我有一个要插入数据库的 XML 块。数据库包含 3 个表,即 itemMappinglinkscategoryLinks 表将只有来自 XML 的链接,category 表将有来自 XML 的 category

<item>
<link>http://google.com</link>

<category>search engine</category>
<category>android</category>
<category>gmail</category>
</item>

我的困惑来了,“itemMaping”表包含以下列:

IDLinkIDCategoryID

itemMapping 表中,我必须插入新插入行的linkID 和categoryID。因此,根据示例 XML itemMapping 表每个类别将有 3 条记录,但要在此表中插入记录,我需要上面的 linkIDcategoryID。我怎样才能做到这一点?如果可能,我想在单个 SP 中执行此操作。

【问题讨论】:

查看 OUTPUT 子句。如果您在从 XML 中提取链接和类别后插入它们,并且这些表具有标识列,您应该能够检索新的标识值。 您使用什么版本的 SQL Server?从 SQL Server 2005 开始,您可以使用 output 子句并且您可以使用 xml 数据类型而不是 openxml。 我正在使用 sql server 2008 express。 【参考方案1】:

您好,请考虑以下表格:

Country Table
CountryID CountryName LastEditUser

Province table
ProvinceID ProvinceName CountryID LastEditUser

将 CountryID 和 ProvinceID 视为身份列。

在 SQL 中,您可以使用单个存储过程将记录插入到这两个表中,看看快速示例

CREATE PROCEDURE InsertProvince
(
@ProvinceName VARCHAR(128),
@CountryName VARCHAR(128),
@LastEditUser VARCHAR(128)
)
AS
    DECLARE @CountryID INT

    INSERT INTO Country
    (CountryName, LastEditUser)
    VALUES
    (@CountryName, @LastEditUser)

    @CountryID = SCOPE_IDENTITY();

    INSERT INTO Province
    (ProvinceName, CountryID, LastEditUser)
    VALUES
    (@ProvinceName, @CountryID, @LastEditUser)
END

SQL Server 有一个名为scope_identity 的函数,它返回插入到同一范围内的标识列中的最后一个标识值。范围是一个模块:存储过程、触发器、函数或批处理。因此,如果两条语句在同一个存储过程、函数或批处理中,则它们属于同一范围。

【讨论】:

感谢您的示例,但我的问题略有不同。就我而言,单个链接可以有 5 或 15 个类别,我必须在 itemMapping 表中插入这 5 或 15 个类别 ID。据我所知scope_identity 将返回最后插入的行 ID,但我将如何获得 5 或 5 个插入行的 ID? @RAJK 这个逻辑已经适用,伙计,您只需创建一个游标,该游标将为每个 ID 循环,然后插入一个映射。如果您不想使用游标,如果问题可以通过使用批量插入来解决,您也可以使用批量插入语句,我更喜欢它。尽管并非所有情况都可以使用批量插入来解决。【参考方案2】:

插入Links 并将LinkIDscope_identity() 捕获到变量中。插入Category 并在表变量中捕获生成的 ID。使用该表变量作为插入到ItemMapping 的源。

假设您的表格如下所示。

create table Category
(
  CategoryID int identity primary key,
  Name varchar(50)
)

create table Links
(
  LinkID int primary key identity,
  Link varchar(50)
)

create table ItemMapping
(
  LinkID int references Links(LinkID),
  CategoryID int references Category(CategoryID),
  primary key(LinkID, CategoryID)
)

您可以使用 XML 变量 @XML 来执行此操作。

declare @IDs table(ID int)
declare @LinkID int

insert into Links(Link)
select T.X.value('.', 'nvarchar(50)')
from @XML.nodes('item/link') as T(X) 

set @LinkID = scope_identity()

insert into Category(Name)
output inserted.CategoryID into @IDs
select T.X.value('.', 'nvarchar(50)')
from @XML.nodes('item/category') as T(X) 

insert into ItemMapping(LinkID, CategoryID)
select @LinkID, I.ID
from @IDs as I

SE-Data

【讨论】:

以上是关于如何使用openxml获取新插入行的ID?的主要内容,如果未能解决你的问题,请参考以下文章

在Word2007中,如何通过Range.InsertXML方法将一个OpenXML插入到空白文档中?

如何使用旧驱动程序获取 JDBC 中插入行的 ID?

如何在 MySQL 中获取多个插入行的 ID?

执行 INSERT 到数据库获取插入行的 id 后如何获取?

如何使用 Diesel 和 SQLite 获取新创建值的 id?

如何使用 Diesel 和 SQLite 获取新创建值的 id?