![](/img/trans.png)
[英]SQL SERVER 2008: Trying to insert multiple rows using 1 SQL Statement
[英]SQL Server 2008 - Selecting multiple rows from OPENXML statement
我有一個XML文件,我使用OPENXML在SQL Server中打開它,然后讀取XML文件中的值並將它們插入表中。 假設XML結構是這樣的
<Student>
<name>XYZ</name>
<id>123</id>
<fathersname>XYS</fathersname>
<fathersid>3489</fathersid>
</Student>".
現在,我需要將其添加為兩個不同的行,並且數據庫應如下所示
Name
ID
XYZ 123
XYS 3489
如何從此XML
讀取並使用單個OPENXML
語句作為兩個不同的行插入?
CREATE TABLE dbo.Person(ID int, [Name] varchar(50))
DECLARE @docHandle int
DECLARE @xmlDocument XML
SET @xmlDocument = N'<ROOT>
<Student>
<name>XYZ</name>
<id>123</id>
<fathersname>XYS</fathersname>
<fathersid>3489</fathersid>
</Student>
<Student>
<name>ABC</name>
<id>456</id>
<fathersname>DEF</fathersname>
<fathersid>7859</fathersid>
</Student>
</ROOT>'
EXEC sp_xml_preparedocument @docHandle OUTPUT, @xmlDocument
-- student's data first
INSERT INTO dbo.Person
SELECT *
FROM OPENXML(@docHandle, N'/ROOT/Student',2)
WITH (id int, name varchar(50))
-- now insert father's data
INSERT INTO dbo.Person
SELECT *
FROM OPENXML(@docHandle, N'/ROOT/Student',2)
WITH (fathersid int, fathersname varchar(50))
SELECT * FROM dbo.Person
EXEC sp_xml_removedocument @docHandle
DROP TABLE dbo.Person
要從文件打開:
declare @xmlDocument XML
SET @xmlDocument=(SELECT * FROM OPENROWSET(
BULK 'c:\Temp\Student.xml',
SINGLE_BLOB) AS x)
更新:
抱歉,沒有看到您嘗試將<father>
拆分為另一行,為此我僅添加了一個INSERT。 如果需要對加載過程進行更多控制,則始終可以考慮在SSIS中設置ETL作業。
更新2
好吧,這是一種只用一個插入物,但有兩個選擇的創造性方法-完全不確定性能。 同樣,我們將一條記錄分為兩行。
INSERT INTO dbo.Person
SELECT
x.e.value('id[1]', 'int') AS "id"
,x.e.value('name[1]', 'varchar(10)') AS "Name"
FROM @xmlDocument.nodes('/ROOT/Student') AS x(e)
UNION
SELECT
x.e.value('fathersid[1]', 'int') AS "id"
,x.e.value('fathersname[1]', 'varchar(10)') AS "Name"
FROM @xmlDocument.nodes('/ROOT/Student') AS x(e);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.