1

データベースに挿入したい XML ブロックがあります。itemMappingデータベースには、 、 の 3 つのlinksテーブルが含まれていますcategoryLinksテーブルには XML からのリンクのみがあり、categoryテーブルにはXML からのリンクがありcategoryます。

<item>
<link>http://google.com</link>

<category>search engine</category>
<category>android</category>
<category>gmail</category>
</item>

「itemMaping」テーブルには次の列が含まれています。

IDLinkIDCategoryID

テーブルに、itemMapping新しく挿入された行の linkID と categoryID を挿入する必要があります。したがって、サンプル XMLitemMappingテーブルによると、カテゴリごとに 3 つのレコードがありますが、このテーブルにレコードを挿入するには、上から必要linkIDになりcategoryIDます。どうすればこれを達成できますか?できればシングルSPでやりたい。

4

2 に答える 2

1

こんにちは、次の表を検討してください。

Country Table
CountryID CountryName LastEditUser

Province table
ProvinceID ProvinceName CountryID LastEditUser

CountryID と ProvinceID が ID 列であると考えてください。

SQL では、単一のストアド プロシージャを使用してこれら 2 つのテーブルにレコードを挿入できます。簡単な例を見てください。

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という関数があり、同じスコープ内の ID 列に最後に挿入された ID 値を返します。スコープは、モジュール (ストアド プロシージャ、トリガー、関数、またはバッチ) です。したがって、2 つのステートメントが同じストアド プロシージャ、関数、またはバッチ内にある場合、これらのステートメントは同じスコープ内にあります。

于 2012-06-03T02:57:31.540 に答える
0

withを変数に挿入し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 に答える