如何将xml数据插入sql server 2005中的表中

时间:2011-01-21 12:52:46

标签: 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列中, Sal数据将插入Sal列。

所以请告诉我如何在商店程序中编写代码。

感谢

2 个答案:

答案 0 :(得分: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>' 

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

答案 1 :(得分: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)