Sql 如何使用openxml获取新插入行的id?
我有一个要插入数据库的XML块。数据库包含3个表,即Sql 如何使用openxml获取新插入行的id?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个要插入数据库的XML块。数据库包含3个表,即itemMapping、links和category链接表将只包含来自XML的链接,类别表将包含来自XML的类别 <item> <link>http://google.com</link> <category>search engine</category> <category>android</category> <category>gmail&
itemMapping
、links
和category
<代码>链接表将只包含来自XML的链接,类别
表将包含来自XML的类别
<item>
<link>http://google.com</link>
<category>search engine</category>
<category>android</category>
<category>gmail</category>
</item>
http://google.com
搜索引擎
安卓
gmail
下面是我的困惑,“itemMaping”表包含以下列:
ID
,LinkID
,CategoryID
在
itemMapping
表中,我必须插入新插入行的linkID和categoryID。因此,根据示例XML,itemMapping
表中每个类别将有3条记录,但要在此表中插入记录,我需要上面的linkID
和categoryID
。我怎样才能做到这一点?如果可能的话,我想在单SP中做到这一点。 < P> >请考虑下列表:
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有一个名为的函数,它返回插入到同一范围内的标识列中的最后一个标识值。作用域是一个模块:存储过程、触发器、函数或批处理。因此,如果在相同的存储过程、函数或批处理中,两个语句在相同的范围内。< P> >考虑下面的表:
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\u identity()
将LinkID
捕获到变量中。插入到类别中
并在表变量中捕获生成的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
插入到
链接中
,并使用scope\u identity()
将LinkID
捕获到变量中。插入到类别中
并在表变量中捕获生成的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
查看OUTPUT子句。如果在从XML中提取链接和类别后插入这些链接和类别,并且这些表具有标识列,则应该能够检索新的标识值。您使用的SQL Server版本是什么?从SQL Server 2005可以使用子句,也可以使用数据类型而不是openxml。我使用的是SQL Server 2008 express。查看输出子句。如果在从XML中提取链接和类别后插入这些链接和类别,并且这些表具有标识列,则应该能够检索新的标识值。您使用的SQL Server版本是什么?从SQL Server 2005开始,您可以使用子句,也可以使用数据类型而不是openxml。我使用的是SQL Server 2008 express。感谢您提供的示例,但我的问题与此略有不同。在我的例子中,一个链接可以有5个或15个类别,我必须在itemMapping表中插入这5个或15个类别ID。据我所知,
scope\u identity
将返回最后一个插入的行ID,但我将如何获取5或5个插入行的ID?@RAJK此逻辑已经适用,伙计,您只需创建一个游标,该游标将循环每个ID,然后插入一个映射。如果不想使用游标,也可以使用批插入语句。如果问题可以通过批插入解决,我更喜欢它。虽然不是所有的情况都可以通过批插入来解决。谢谢你的例子,但是我的问题没有什么不同。在我的例子中,一个链接可以有5个或15个类别,我必须在itemMapping表中插入这5个或15个类别ID。据我所知,scope\u identity
将返回最后一个插入的行ID,但我将如何获取5或5个插入行的ID?@RAJK此逻辑已经适用,伙计,您只需创建一个游标,该游标将循环每个ID,然后插入一个映射。如果不想使用游标,也可以使用批插入语句。如果问题可以通过批插入解决,我更喜欢它。尽管并非所有情况都可以使用批插入解决。