2011-01-21 135 views
5

我的表结构如何将XML数据插入到表中的SQL Server 2005

CREATE TABLE [dbo].[Emp](
    [ID] [int] NOT NULL, 
    [EmpName] [varchar](50) NOT NULL, 
    [Sal] [int] NULL, 
) 
在这个表emp我想从一个XML字符串插入数据

的XML是

<Record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Emp> 
<ID>3</ID><EmpName>Dibyendu</EmpName><Sal>3500</Sal></Emp></Record> 

假设这个xml存储在我的存储过程中的一个变量,我只想插入这个xml,使得在EMP表中作为结果ID数据将插入到ID列中,EmpName数据将插入到EmpName列中n和Sal数据将插入到Sal列中。

所以请告诉我如何在存储过程中编写代码。

感谢

回答

9

假设如上XML示例:

<Record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Emp> 
     <ID>3</ID> 
     <EmpName>Dibyendu</EmpName> 
     <Sal>3500</Sal> 
    </Emp> 
</Record> 

假设如下表:

CREATE TABLE Employee 
(
    [ID] [int] NOT NULL, 
    [EmpName] varchar(max) NOT NULL, 
    [Sal] [int] NULL 
) 

下面的存储过程,它使用XPath的,应该做的伎俩

CREATE PROCEDURE AddEmployee 
    @empXml xml 
AS 

INSERT INTO Employee 
(
    ID, 
    EmpName, 
    Sal 
) 
VALUES 
(
    @empXml.value('(/Record/Emp/ID)[1]', 'int'), 
    @empXml.value('(/Record/Emp/EmpName)[1]', 'varchar(max)'), 
    @empXml.value('(/Record/Emp/Sal)[1]', 'int') 
) 

然后你就可以执行与:

exec AddEmployee '<Record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Emp><ID>3</ID><EmpName>Dibyendu</EmpName><Sal>3500</Sal></Emp></Record>' 

您需要如果记录XML可能包含多个'Emp'元素,则进行一些重构。

+0

非常感谢你的完整例子。 – Thomas 2011-01-21 13:28:04

4

看一看像

DECLARE @Xml XML 

DECLARE @Emp TABLE(
     [ID] [int] NOT NULL, 
     [EmpName] varchar NOT NULL, 
     [Sal] [int] NULL 
) 

SELECT @Xml = '<Record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><Emp><ID>3</ID><EmpName>Dibyendu</EmpName><Sal>3500</Sal></Emp></Record>' 

SELECT @Xml.value('(/Record/Emp/ID)[1]', 'int') ID, 
     @Xml.value('(/Record/Emp/EmpName)[1]', 'VARCHAR(MAX)') EmpName, 
     @Xml.value('(/Record/Emp/Sal)[1]', 'int') Sal 

如果你有多个行,你可以尝试这样

DECLARE @Xml XML 

SELECT @Xml = '<Record><Emp><ID>3</ID><EmpName>Dibyendu</EmpName><Sal>3500</Sal></Emp><Emp><ID>4</ID><EmpName>TADA</EmpName><Sal>5</Sal></Emp></Record>' 

SELECT A.B.value('(ID)[1]', 'int') ID, 
     A.B.value('(EmpName)[1]', 'VARCHAR(MAX)') EmpName, 
     A.B.value('(Sal)[1]', 'int') Sal 
FROM @Xml.nodes('/Record/Emp') A(B) 
相关问题