2011-01-21 12 views
5

mi estructura de la tabla esCómo insertar datos XML en la tabla en SQL Server 2005

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

en esta tabla emp quiero insertar datos de una cadena XML

el xml es

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

supongamos que este xml se almacena en una variable en mi procedimiento de tienda y solo quiero insertar este xml de tal manera que en la tabla EMP los datos de ID se inserten en la columna ID, los datos EmpName se insertarán en la columna EmpName Los datos n y Sal se insertarán en la columna Sal.

así que por favor dígame cómo escribir el código en el procedimiento de la tienda.

gracias

Respuesta

9

Suponiendo XML de ejemplo que el anterior:

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

Asumiendo la siguiente tabla:

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

El siguiente procedimiento almacenado, que utiliza XPaths, debe hacer el truco

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 luego se puede ejecutar con:

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

Necesitará hacer una pequeña refactorización si el XML de registro podría incluir múltiples elementos 'Emp'.

+0

muchas gracias por su ejemplo completo. – Thomas

+0

Si está buscando hacer algo similar con elementos múltiples, esta pregunta relacionada debería tener la respuesta: http://stackoverflow.com/questions/1554792/iterating-xml-data-in-sql-server-2005 – psych

4

Tenga una mirada en algo así como

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 

Y si fuera a tener múltiples filas que pueden intentar algo así como

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