2011-01-21 155 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) 
相關問題