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);
嗨..是否有可能這樣做只有一個插入和選擇語句?我實際上只是在尋找那個.. – Prabhu 2009-11-10 07:03:47
看不到 - 你試圖在一個插入中將一條記錄分成兩行。但後來可能有一種創造性的方式...... – 2009-11-10 13:56:07
只是爲了跑步看看更新2。 – 2009-11-10 14:19:57