miércoles, mayo 30, 2007

SQL Server 2005 y el tipo de datos XML: Configuración del esquema

Escenario inicial

Tenemos una tabla donde una (o más) de las columnas son de tipo XML
Queremos crear un esquema que represente el contenido de esa columna para acelerar las queries que vayan contra esa columna.

Procedimiento

Cogemos un XML que sea representativo, que tenga todos los campos que vamos a necesitar.
Guardamos el fichero en disco.
Usando la aplicación XSD (Visual Studio Tools a Visual Studio 2005 Command Prompt) ejecutamos el comando XSD [nombre_fichero.xml]

Nota: es posible que de fallos porque haya caracteres extraños. Hay que quitar las Ñ, %, $, €, …

Abro el fichero que se ha generado (misma ruta y nombre que el origen, pero con XSD de extensión) con el Notepad.
El contenido es el esquema del XML elegido.
Voy al SQL Server 2005 y hago una nueva query:

IF EXISTS (SELECT *
FROM sys.xml_schema_collections
WHERE name = N'mySchema')
DROP XML SCHEMA COLLECTION mySchema
GO

CREATE XML SCHEMA COLLECTION mySchema
AS
'
CONTENIDO DEL FICHERO XSD
'
GO


Donde pone CONTENIDO DEL FICHERO XSD, meto el contenido del XSD.

Ejecuto la query. Si todo ha ido bien, se habrá añadido a la lista de esquemas de SQL Server.
Voy a la tabla, con el fin de modificarla. Voy a la columna XML y en propiedades, configuro la sección de XML.

Elijo el esquema que acabo de crear, del combo de Schema Collection y configuro Is XML Document como Yes.

Nota: si no aparece es posible que haya fallado el refresco. Cerramos la pestaña y la volvemos a abrir.

Damos a guardar los cambios de la tabla. Si todos los XML que estén presentes (si los hay) concuerdan con el esquema, no habrá problema y se guardará. Si alguno no concuerda, habra que hacer modificaciones en el esquema para que encaje. Uno de los posibles cambios que, seguramente, habrá que hacer, es distribuir los elementos simples (que no tienen sub-elementos), ya que la herramienta XSD suele colocarlos juntos al crear el esquema. De todas maneras, en los errores que da al guardar, nos indica qué campos esperaba encontrar y cuales ha encontrado realmente.

No hay comentarios.: