Как вставить вывод из xml.nodes() в таблицу?

Я новичок в SQL Server, и я пытаюсь вставить строки в базу данных из документов XML. Я провел некоторые исследования и сумел получить XML в набор строк с помощью функции узлов XML. Тем не менее, я понятия не имею, что делать дальше. Как вставить этот набор строк в существующую таблицу с такими же именами столбцов?

Ниже то, что у меня есть, может ли кто-нибудь помочь с тем, куда я иду дальше?

DECLARE @xml xml
SET @xml = 
N'  <Products>
        <Product>
        <id>4</id>
        <name>Amy</name>
        <age>25</age>
        </Product>
        <Product>
            <id>7</id>
            <name>Vicky</name>
            <age>40</age>
        </Product>
    </Products>'

SELECT  doc.col.value('id[1]',      'nvarchar(10)')     id
    ,   doc.col.value('name[1]',    'varchar(100)')     name 
    ,   doc.col.value('age[1]',     'nvarchar(10)')     age 
FROM    @xml.nodes('/Products/Product') doc(col)

3 ответа

Решение

Вам нужно передать вывод SELECT заявление в INSERT утверждение таблицы, в которую вы хотите, чтобы данные были заполнены.

Предложения:

  • Вы можете изменить тип данных, используемый для узлов id и age, с nvarchar(10) на int при условии, что оба поля должны представлять числа.

Сценарий:

CREATE  TABLE dbo.mytable
(   
        id      INT         NOT NULL
    ,   name    VARCHAR(30) NOT NULL
    ,   age     INT         NULL
)

DECLARE @xml xml
SET @xml = 
N'  <Products>
        <Product>
        <id>4</id>
        <name>John</name>
        <age>25</age>
        </Product>
        <Product>
            <id>7</id>
            <name>Jane</name>
            <age>40</age>
        </Product>
        <Product>
            <id>6</id>
            <name>Jill</name>
            <age></age>
        </Product>
    </Products>'

INSERT INTO dbo.mytable (id, name, age)
SELECT  doc.col.value('id[1]',      'int')      id
    ,   doc.col.value('name[1]',    'varchar(100)')     name 
    ,   doc.col.value('age[1]',     'int')      age 
FROM    @xml.nodes('/Products/Product') doc(col);

SELECT * FROM dbo.mytable;

Выход:

id  name    age
--  ------  ---
4   John    25
7   Jane    40
6   Jill    0

Вам может понадобиться это

INSERT INTO YourTableName(Id,name,age)
SELECT
 doc.col.value('id[1]', 'nvarchar(10)') id
,doc.col.value('name[1]', 'varchar(100)') name 
,doc.col.value('age[1]', 'nvarchar(10)') age 
FROM @xml.nodes('/Products/Product') doc(col)
INSERT INTO Table
(
col1
, col2
, col3
)
SELECT
 doc.col.value('id[1]', 'nvarchar(10)')
,doc.col.value('name[1]', 'varchar(100)')
,doc.col.value('age[1]', 'nvarchar(10)')
FROM 
    @xml.nodes('/Products/Product') doc(col)
Другие вопросы по тегам