2012-05-01 53 views
0

我是新來的sql服務器,我想從XML文檔插入行到數據庫中。我已經做了一些研究並設法使用XML節點功能將XML放入行集。但是,我不知道下一步該怎麼做。如何將此行集插入到具有相同列名的現有表中?如何將xml.nodes()的輸出插入表中?

下面是我到目前爲止,任何人都可以幫助我下一步去哪裏?

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) 

回答

1

您需要將SELECT語句的輸出傳遞到INSERT語句中的表,你會喜歡被填充數據成。

建議

  • 您可以更改用於ID年齡爲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 
+0

想知道是否有這樣做的手短呢?在有些情況下,我有很多字段和很多節點可以匹配,實質上我只是希望將每個節點插入到行中的每個對應字段中。我所有的節點名稱和所有字段名稱都是相同的。 – LeeTee

+0

另外,我是否必須通過並指定每個字段的字段類型?它可以不只是進入數據庫... – LeeTee

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) 
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)