Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用openxml获取新插入行的id?_Sql_Sql Server_Tsql - Fatal编程技术网

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

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&

我有一个要插入数据库的XML块。数据库包含3个表,即
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,然后插入一个映射。如果不想使用游标,也可以使用批插入语句。如果问题可以通过批插入解决,我更喜欢它。尽管并非所有情况都可以使用批插入解决。