Как вставить вывод из 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)