如何使用openxml获取新插入行的ID?
Posted
技术标签:
【中文标题】如何使用openxml获取新插入行的ID?【英文标题】:how to get id of newly inserted rows using openxml? 【发布时间】:2012-06-02 19:00:06 【问题描述】:我有一个要插入数据库的 XML 块。数据库包含 3 个表,即 itemMapping
、links
和 category
。 Links
表将只有来自 XML 的链接,category
表将有来自 XML 的 category
。
<item>
<link>http://google.com</link>
<category>search engine</category>
<category>android</category>
<category>gmail</category>
</item>
我的困惑来了,“itemMaping”表包含以下列:
ID
、LinkID
、CategoryID
在itemMapping
表中,我必须插入新插入行的linkID 和categoryID。因此,根据示例 XML itemMapping
表每个类别将有 3 条记录,但要在此表中插入记录,我需要上面的 linkID
和 categoryID
。我怎样才能做到这一点?如果可能,我想在单个 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
并将LinkID
和scope_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插入到空白文档中?
执行 INSERT 到数据库获取插入行的 id 后如何获取?