Domanda

insieme di schemi XML di SQL Server è un concetto interessante e lo trovo molto utile quando si progetta il contenuto dei dati dinamici. Tuttavia, come io lavoro la mia strada attraverso l'implementazione di raccolte di schemi, trovo molto difficile mantenere loro.

insieme di schemi DDL consente solo CREATE e ALTER / aggiungere nodi a regimi esistenti.

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

Quando si desidera rimuovere qualsiasi nodo da uno schema si deve lanciare in seguito DDL di.

  1. Se questo insieme di schemi assegnato a una colonna della tabella, è necessario modificare tavolo per rimuovere l'associazione insieme di schemi da quella colonna
  2. Goccia l'oggetto insieme di schemi
  3. Ricreare insieme di schemi
  4. colonna della tabella Alter di ri-associare raccolta di schemi a quella colonna.

Questo è il dolore quando si tratta di 100 + di schemi in una collezione. Inoltre è necessario ricreare gli indici XML tutto da capo, se presente.

Tutte le soluzioni, suggerimenti, trucchi per rendere questo processo di editing di raccolta oggetto dello schema più facile?

È stato utile?

Soluzione

Sono d'accordo con Davide che XML non è la panacea c'è stato detto che sarebbe stato, ma ci sono alcune situazioni in cui è sia inevitabile o lo strumento migliore per il lavoro. manutenzione schema è doloroso però. Ho solo un paio di affrontare e ancora perdere ore.

Questo script potrebbe aiutare. Esso genera le gocce della tabella e aggiunge avrete bisogno. Si avrebbe bisogno di mdified includere UDF o altri oggetti che potrebbero fare riferimento allo schema XML. Per generare le dichiarazioni Add schema, ti suggerisco di usare i "Scripts Genera ..." funzione nel menu compiti Mgt Studio e salvarli fuori per la fase 2 dello 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].['+@schemaName+']'

    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

Speranza che aiuta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top