如何将xml.nodes()的输出插入表中?

时间:2012-05-01 10:54:07

标签: sql-server xml sql-server-2008 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 个答案:

答案 0 :(得分:1)

你可能需要这个

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)

答案 1 :(得分:1)

您需要将SELECT语句的输出传递到您希望填充数据的表的INSERT语句。

建议

  • 您可以将用于 id age 节点的数据类型从 nvarchar(10)更改为 int < / strong>假设两个字段都应代表数字。

脚本

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

答案 2 :(得分:0)

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)