2009-11-09 81 views
1

我有一個XML文件,並使用OPENXML在SQL Server中打開它,然後讀取XML文件中的值並將它們插入表中。假設XML結構是這樣的SQL Server 2008-從OPENXML語句中選擇多行

<Student> 
    <name>XYZ</name> 
    <id>123</id> 
    <fathersname>XYS</fathersname> 
    <fathersid>3489</fathersid> 
</Student>". 

現在我需要添加爲兩個不同的行和數據庫應該是這樣的
NameID
XYZ 123
XYS 3489
我怎樣才能從這個XML和插入閱讀作爲兩個不同的行使用單個OPENXML聲明?

回答

1
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) 

UPDATE:
對不起,沒看到你想要<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); 
+0

嗨..是否有可能這樣做只有一個插入和選擇語句?我實際上只是在尋找那個.. – Prabhu 2009-11-10 07:03:47

+0

看不到 - 你試圖在一個插入中將一條記錄分成兩行。但後來可能有一種創造性的方式...... – 2009-11-10 13:56:07

+1

只是爲了跑步看看更新2。 – 2009-11-10 14:19:57