0% encontró este documento útil (0 votos)
2 vistas5 páginas

Procesamiento de XML en SQL Server

Cargado por

celsss
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
2 vistas5 páginas

Procesamiento de XML en SQL Server

Cargado por

celsss
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

!

" #$

!!! " # $ # $ $ % # &


$ $ $ %
' ( ()* # + ,- % & $
$ $ % # $ . / 0 # $ . * 1
( ()*&23 ( *&4 56*( 5( (*(/ $

4 $ $$ 0 $
$ $ # $ $ $ % . $ $& $ $ 7
/ $ # $ &$ 0 $ $ $ 0
$ % $ $ " $ + 0 $ 5 & $
$ + . / # * 1 $ $ # " 0
. " $ $ / $ + $ # $ . # $
$ ' $ # " $ # $ 8$ $
8$ /

% & ' (

$ $ 7 % # $ +$ . & # &
# $ $ / $ &$ +
$ 9 + :

OPENXML(num_doc int, patron_filas nvarchar) [WITH (esquema_filas)]

• num_doc: Controlador interno del documento (un número entero obtenido mediante sp_xml_preparedocument)
• patron_filas: Patrón XPath que identifica cuáles de los nodos del documento XML se procesarán
• esquema_filas: Definición del tipo de datos que contienen los nodos del documento XML, en formato [nombre_columna,
tipo_dato_columna]

Veamos un pequeño ejemplo donde se obtiene un conjunto de registros de dos columnas a partir de un documento XML con la
siguiente estructura:

<paises>
<pais IdPais="1" Nombre="Francia"/>
<pais IdPais="2" Nombre="Italia"/>
</paises>

, ;<(# $ $ $
) = $ $ " > > $ $ :
0 $ 0 8 $ $ 0
$ 0 0= & 0 ? @ $ % 0 " $ $ $ " +
$ $& $ ( ()*

%) # * (
' $ $ + : $ $ 7
$ 0 "# $ 9 # :

DECLARE @ids varchar(20)


SET @ids = '5, 6, 7, 8'
EXEC('SELECT * FROM Empleados WHERE IdEmpleado IN (' + @ids + ')')

$ $& = " $ & $$ "


& 0 $ = :

• # $ $ $ 0 & 0 $
+ "
• $ . 0 # $ $
$ 0 # /9 (* $ $ 7

+ & $ $ $ = $ ( $ A
. B / $ $ C " :

$ " $$ $ $ +
' :DDEEE ' " 'D 0D 0 $ '

% $ $ "$ 0
$ &" $ $ $ $ ' & # " $ $ $ & =
$ * $ $ $ $ 0 $ 0 8
$ $ :

, <, $ # $ $

$ $ $ 0 % . $ $& $ $ 7 /0
$+ $ $+ $ "$ 0 $

,, --+

$ $ $ " ?( $ @0 8 " $ :

/* Crear la base de datos PruebasXML */


CREATE DATABASE PruebasXML
GO
USE PruebasXML
GO
/* Crear la tabla Empleados */
CREATE TABLE Empleados
(
IdEmpleado int IDENTITY(1, 1) PRIMARY KEY,
Nombre varchar(20),
Apellido1 varchar(20),
Apellido2 varchar(20),
FechaNacimiento datetime
)
GO
/* Insertar algunos registros */
INSERT INTO Empleados VALUES ('Jorge', 'Martínez', 'García', '19760703')
INSERT INTO Empleados VALUES ('Pedro', 'López', 'Valle', '19680319')
INSERT INTO Empleados VALUES ('Luis', 'Iglesias', 'González', '19961107')
INSERT INTO Empleados VALUES ('Alfredo', 'Muñiz', 'Suárez', '19790901')
INSERT INTO Empleados VALUES ('Sergio', 'Rodríguez', 'Alvarez', '19810430')
INSERT INTO Empleados VALUES ('Rafael', 'Fuentes', 'Aranda', '19661022')
INSERT INTO Empleados VALUES ('Miguel', 'Arias', 'Gómez', '19700101')
GO

4 8 $ $ $ " $ & $ $ ?6 8$ $ @$
= :

, F< $ ! $

) ' $ $ 0 $ + $ $ # $ $ & > $ % $:

CREATE PROCEDURE spInformeEmpleados @TextoXML varchar(2000) AS


SET NOCOUNT ON
DECLARE @DocXML int
/* Cargar el documento XML del texto del argumento @TextoXML */
EXEC sp_xml_preparedocument @DocXML output, @TextoXML
/* Seleccionar los registros de la tabla Empleados cuyo campo IdEmpleado esté incluido
en el nodo <empleados/empleado/IdEmpleado> del documento XML */
SELECT * FROM Empleados WHERE IdEmpleado IN (
SELECT IdEmpleado FROM OpenXML(@DocXML, 'empleados/empleado') WITH (IdEmpleado int)
) ORDER BY Apellido1, Apellido2
/* Destruir el documento XML y liberar memoria */
EXEC sp_xml_removedocument @DocXML
SET NOCOUNT OFF
G $ $ & *7 % & $ % 0 $ . $ $ $
" / 0 $ 0 $ $ ( $ % $+ :

<empleados>
<empleado IdEmpleado="1"/>
<empleado IdEmpleado="3"/>
<empleado IdEmpleado="4"/>
<empleado IdEmpleado="6"/>
</empleados>

( + 0 H I! " 65- 0 ' $ $ $


$ $ ( $ ., ;/ $ &" $ $ ( $ "
+$ # $:

Private Sub Form_Load()


Dim Cn As [Link], Rs As [Link]
Set Cn = New [Link]
Set Rs = New [Link]
[Link] "Provider=SQLOLEDB.1;Initial Catalog=PruebasXML;Data Source=SERVIDORSQL"
[Link] "SELECT * FROM Empleados ORDER BY Apellido1, Apellido2", Cn, adOpenForwardOnly
While Not [Link]
'// Cargar el control ListView con los empleados de la base de datos
With [Link](, , [Link]("Nombre"), , 1)
.Tag = [Link]("IdEmpleado")
.SubItems(1) = [Link]("Apellido1")
.SubItems(2) = [Link]("Apellido2")
.SubItems(3) = [Link]("FechaNacimiento")
End With
[Link]
Wend
[Link]: Set Rs = Nothing
[Link]: Set Cn = Nothing
End Sub

( %$ ?6 @.& / $ $ . $ # ' '() /


$ > $ % 0 $ $ $ $ $ :

Private Sub btnAceptar_Click()


If [Link] Is Nothing Then
MsgBox "Debe seleccionar al menos un empleado para el informe", vbCritical
Else
MostrarInforme GenerarXML
End If
End Sub

Private Sub MostrarInforme(ByVal strXML As String)


Dim Cn As [Link], Cm As [Link]
Set Cn = New [Link]
Set Cm = New [Link]
With Cn
.Mode = adModeRead
.CursorLocation = adUseClient
.Open "Provider=SQLOLEDB.1;Initial Catalog=PruebasXML;Data Source=SERVIDORSQL"
End With
'// Llamar al procedimiento almacenado spInformeEmpleados, con la cadena XML como argumento
With Cm
.ActiveConnection = Cn
.CommandText = "spInformeEmpleados"
.CommandType = adCmdStoredProc
.[Link] .CreateParameter("@TextoXML", adVarChar, adParamInput, 2000, strXML)
MostrarVistaPreviaInforme .Execute
End With
[Link]: Set Cn = Nothing
End Sub

Private Function GenerarXML() As String


Dim Li As [Link], strXML As String
'// Generar la cadena XML según el campo IdEmpleado (almacenado en la
'// propiedad Tag de cada elemento del ListView)
For Each Li In [Link]
If [Link] Then strXML = strXML & "<empleado IdEmpleado=""" & [Link] & """/>"
Next Li
GenerarXML = "<empleados>" & strXML & "</empleados >"
End Function

Private Sub MostrarVistaPreviaInforme(ByRef Rs As [Link])


Set [Link] = Rs
[Link] vbModal, frmEmpleados
[Link]: Set Rs = Nothing
End Sub

( & 8 $ $ H$ ' * $ I!& = :

, J< $ ' * $ I!

También podría gustarte