2009-11-09 3 views
1

У меня есть XML-файл, и я открываю его на SQL Server с помощью OPENXML, а затем читаю значения в файле 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> в другой ряд, я просто добавил еще один ВСТАВКУ для этого. Если вам нужно больше контролировать процесс загрузки, вы всегда можете рассмотреть возможность создания задания ETL в SSIS.

UPDATE 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

+0

Не вижу, как - вы пытаетесь разбить одну запись на две строки в одной вставке. Но тогда может быть творческий способ каким-то образом ... –

+1

Просто для запуска посмотрите UPDATE 2. –

Смежные вопросы