如何从单个插入语句将 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)
A
和B
的关系是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
我在 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)
A
和B
的关系是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