2011-01-21 3 views
5

ma structure de table estComment insérer des données XML dans la table dans SQL Server 2005

CREATE TABLE [dbo].[Emp](
    [ID] [int] NOT NULL, 
    [EmpName] [varchar](50) NOT NULL, 
    [Sal] [int] NULL, 
) 

dans ce tableau emp je veux insérer des données à partir d'une chaîne XML

le xml est

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

supposons que xml est stocké dans une variable dans ma procédure de stockage et je veux juste insérer ce xml de telle manière que dans la table EMP comme résultat les données d'ID seront insérées dans la colonne ID, les données EmpName seront insérées dans EmpName Les données n et Sal seront insérées dans la colonne Sal. Alors s'il vous plaît dites-moi comment écrire le code dans la procédure de magasin s'il vous plaît.

grâce

Répondre

9

En supposant exemple XML comme ci-dessus:

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

En supposant que le tableau suivant:

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

La procédure stockée, qui utilise XPath, devrait faire l'affaire

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

que vous pouvez ensuite exécuter avec:

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

Vous aurez besoin faire un peu de refactoring si le XML Record pouvait potentiellement inclure plusieurs éléments 'Emp'.

+0

merci beaucoup pour votre exemple complet. – Thomas

+0

Si vous cherchez à faire des choses similaires avec plusieurs éléments, cette question connexe devrait avoir la réponse: http://stackoverflow.com/questions/1554792/fractoring-xml-data-in-sql-server-2005 – psych

4

Jetez un oeil à quelque chose comme

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 

Et si vous deviez avoir plusieurs lignes, vous pouvez essayer quelque chose comme

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