如何从单个插入语句将 XML 集合插入到 table?

How to insert an XML collection to table from a single insert statement?

我在 SQL 服务器中有这个 table 结构

Table-A
AID    int (PK)--> set to autoincrement
Name varchar(200)

Table - B
BID  int PK  --> NOT set to auto increment
AID  int PK FK
Number1   int
Holographic  decimal(16,2)

AB的关系是1 : M。 因此,从我的 C# 应用程序 Table-B 中,数据以 XML 的形式发送,结构如下。

<TABLEB>
<RECORD>
  <BINID>23</BINID>
  <NUMBER1>123</NUMBER1>
  <HOLOGRAPHIC>2345.12</HOLOGRAPHIC>
</RECORD>
<RECORD>
  <BINID>3</BINID>
  <NUMBER1>346233</NUMBER1>
  <HOLOGRAPHIC>12.345</HOLOGRAPHIC>
</RECORD>
</TABLEB>

在我的 SQL 中,首先我将 Name 记录插入到 Table-A,然后插入到 Table-B。要获得 AID 我必须先插入到 Table-A。有没有办法用 AID 值一次保存所有 xml 条记录? { 因为 xml 中没有 AID 值}

您可以创建一个存储过程来执行此操作。我不知道如何将 Name 插入到第一个 table,但这是 sp 可以插入所有记录的方法:

Create procedure insertSomething
@name as nvarchar(max),
@xmlData as xml
as
begin
declare @aid int;
-- insert data to table A
insert into tableA (Name) Values(@name);
select @aid = scope_identity(); -- gets newly created identity value
-- Shred xml data
Declare @docH int; -- Create document handle
-- get xml data
Declare @x as xml = @xmlData;
-- prepare xml doc
EXEC [sys].[sp_xml_preparedocument] @docH OUTPUT, @x
--get xml data in table format and insert into your destination table
insert into tableB (bid, aid, Number, Holographic)
SELECT BINID, @aid, NUMBER1, HOLOGRAPHIC
FROM    OPENXML(@docH, '/TABLEB/RECORD', 3) 
WITH(BINID int, NUMBER1 int, HOLOGRAPHIC decimal(16,2))
EXEC [sys].[sp_xml_removedocument] @docH
end

然后,运行如下:

DECLARE @z AS XML = '<TABLEB>
<RECORD>
<BINID>23</BINID>
<NUMBER1>123</NUMBER1>
<HOLOGRAPHIC>2345.12</HOLOGRAPHIC>
</RECORD></TABLEB>'

EXEC [dbo].[insertSomething] @name = N'name', -- nvarchar(max)
@xmlData = @z -- xml