簡體   English   中英

SQL Server 2008-從OPENXML語句中選擇多個行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM