2012-06-02 46 views
1

我有一个XML块,我想插入到数据库中。数据库包含3个表格,即itemMapping,linkscategoryLinks表将只有XML链接,category表将从XML有category如何使用openxml获取新插入的行的ID?

<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中执行此操作。

+4

查找到输出条款。如果在从XML中提取链接和类别之后插入链接和类别,并且这些表具有标识列,则应该能够检索新的标识值。 –

+1

你使用什么版本的SQL Server?从SQL Server 2005可以使用[输出](http://msdn.microsoft.com/en-us/library/ms177564.aspx)子句**和**,您可以使用[xml](http:// msdn.microsoft.com/en-us/library/ms187339)数据类型而不是openxml。 –

+0

我正在使用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函数,它返回插入的最后一个标识值同一范围内的身份列。范围是一个模块:存储过程,触发器,函数或批处理。因此,如果两个语句处于相同的存储过程,函数或批处理中,它们在相同的范围内。

+0

谢谢你的例子,但我的问题是有点不同。在我的情况下,一个链接可以有5或15个类别,我必须在itemMapping表中插入5或15个类别ID。据我所知'scope_identity'将返回最后插入的行ID,但我将如何获得5或5插入行的ID? –

+0

@RAJK这个逻辑已经适用于你的伙伴,你只需要创建一个游标来循环每个这些ID然后插入一个映射。你也可以使用批量插入语句,如果你不喜欢使用游标,如果通过使用批量插入可以解决问题,我更喜欢它。尽管并非所有情况都可以使用批量插入来解决。 –

0

插入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

相关问题