2010-02-11 12 views
13

Colección de esquemas XML de SQL Server es un concepto interesante y me resulta muy útil al diseñar contenido de datos dinámicos. Sin embargo, a medida que avanzo en la implementación de las Colecciones de esquemas, me resulta muy difícil mantenerlos.Modificación de la colección de esquemas de SQL Server

Colección de esquemas DDL solo permite CREAR y ALTERAR/AGREGAR nodos a esquemas existentes.

CREATE XML SCHEMA COLLECTION [ <relational_schema>. ]sql_identifier AS 'XSD Content' 
ALTER XML SCHEMA COLLECTION [ <relational_schema>. ]sql_identifier ADD 'Schema Component' 

Cuando desee eliminar cualquier nodo de un esquema, debe emitir los siguientes DDL.

  1. Si esa colección de esquemas asignado a una columna de la tabla, se tienen que modificar la tabla para eliminar asociación colección de esquemas de esa columna
  2. gota la colección de esquemas objeto
  3. Re-Crear colección de esquemas
  4. mesa
  5. Alter columna para volver a asociar la colección de esquemas a esa columna.

Esto es dolor cuando se trata de más de 100 esquemas en una colección. También debe volver a crear índices XML de nuevo, si los hubiera.

¿Alguna solución, sugerencia o truco para facilitar este proceso de edición de objetos de colección de esquemas?

+0

Buena pregunta. Siempre quise saber cómo funciona exactamente ALTER/ADD, y cómo manipula el XML original. – devio

+1

es este tipo de soporte deficiente para los tipos XML en SQL Server 2005 lo que nos hizo alejarnos de ellos. Parecen ordenados, pero hay una gran cantidad de problemas más adelante. Lo peor para nosotros fue: incapacidad de usar una tabla con columnas de tipo XML en una consulta distribuida (servidor vinculado); y las columnas calculadas son difíciles de secuenciar debido a la orden de dependencias. Solo di no, y haz relacional puro. –

Respuesta

3

Estoy de acuerdo con David en que XML no es la panacea que nos dijeron que sería, pero hay algunas situaciones en las que es inevitable o la mejor herramienta para el trabajo. Sin embargo, el mantenimiento del esquema es doloroso. Solo tengo que lidiar con un par y aun así perder horas.

Este script puede ayudar. Genera las caídas de tabla y agrega lo que necesita. Tendría que modificarse para incluir UDF u otros objetos que pudieran hacer referencia al esquema XML. Para generar las instrucciones Agregar esquema, le sugiero que utilice la función "Generar scripts ..." en el menú de tareas en Mgt Studio y guárdelas para el paso 2 del script.

SET NOCOUNT ON 

/* 
    1) Save cols to table var 
*/ 
DECLARE @xmlCols TABLE (
numID INTEGER IDENTITY(1,1), 
TBL nvarchar(1024), 
COL nvarchar(1024), 
SCH nvarchar(1024) 
); 

insert into @xmlCols (TBL,COL,SCH) 
SELECT DISTINCT OBJECT_NAME(colm.object_id) AS 'TABLE', colm.name AS 'COLUMN', coll.name AS 'Schema' 
FROM sys.columns colm 
    inner JOIN  sys.xml_schema_collections coll 
     ON colm.xml_collection_id = coll.xml_collection_id 
ORDER BY OBJECT_NAME(colm.object_id), colm.name 

DECLARE @lastRow as int 
DECLARE @currentRow as int 
DECLARE @dbName as varchar(1024) 
DECLARE @tableName as varchar(1024) 
DECLARE @colName as varchar(1024) 
DECLARE @schemaName as varchar(1024) 
SET @lastRow = @@ROWCOUNT 
SET @currentRow = @lastRow 
SET @dbName = 'dbNAme' 

print '' 
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 
print '--!!!!! Scipt Schemas and Save in Mgt Studio !!!!' 
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 
print '' 


print '' 
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 
print '--!!!!! Omit Schemas from COls !!!!' 
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 
print '' 
--omit the Schema for each column 
WHILE @currentRow <> 0 
BEGIN 
    SELECT @tableName=TBL, @colName=COL, @schemaName=SCH from @xmlCols WHERE numID = @currentRow 

    print N'ALTER TABLE [' + @tableName + N'] ALTER COLUMN ['+ @colName + N'] XML' 

    set @currentRow = @currentRow -1 
END 

print '' 
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 
print '--!!!!! drop your xml schema(s) !!!!' 
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 
print '' 
SET @currentRow = @lastRow 
WHILE @currentRow <> 0 
BEGIN 
    SELECT @tableName=TBL, @colName=COL, @schemaName=SCH from @xmlCols WHERE numID = @currentRow 

    print N'DROP XML SCHEMA COLLECTION [dbo].['[email protected]+']' 

    set @currentRow = @currentRow -1 
END 

print '' 
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 
print '--!!!!! CLean your Tables  !!!!' 
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 
print '' 

--clean up the tables 
SET @currentRow = @lastRow 
WHILE @currentRow <> 0 
BEGIN 
    SELECT @tableName=TBL, @colName=COL, @schemaName=SCH from @xmlCols WHERE numID = @currentRow 

    print N'DBCC CleanTable (''' + @dbName + N''', ''' + @tableName + N''', 0)' 

    set @currentRow = @currentRow -1 
END 

print '' 
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 
print '--!!!!! Run XML Schema Scripts !!!!' 
print '--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' 
print '' 
SET @currentRow = @lastRow 
WHILE @currentRow <> 0 
BEGIN 
    SELECT @tableName=TBL, @colName=COL, @schemaName=SCH from @xmlCols WHERE numID = @currentRow 

    print N'ALTER TABLE [' + @tableName + N'] ALTER COLUMN ['+ @colName + N'] XML('+ @schemaName + N')''' 

    set @currentRow = @currentRow -1 
END 

Espero que ayude.

+0

Muchas gracias. Probaré tu solución tan pronto como pueda. – mevdiven

Cuestiones relacionadas