1

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

<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表,每个类别将有 3 条记录,但要在此表中插入记录,itemMapping我需要从上面插入记录。我怎样才能做到这一点?如果可能,我想在单个 SP 中执行此操作。linkIDcategoryID

4

2 回答 2

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

于 2012-06-03T02:57:31.540 回答
0

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

假设您的表格看起来像这样。

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-数据

于 2012-06-05T16:51:49.683 回答