Question

Schéma XML SQL Server Collection est un concept intéressant et je trouve très utile lors de la conception du contenu de données dynamiques. Cependant, comme je me frayer un chemin à travers la mise en œuvre des collections de schéma, je trouve qu'il est très difficile de les maintenir.

Collection schéma permet seulement DDL créer et modifier / ajouter des nœuds aux régimes existants.

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

Lorsque vous voulez supprimer un nœud d'un schéma que vous devez émettre. Ce qui suit DDL

  1. Si cette collection de schéma attribué à une colonne de table, vous devez modifier table pour supprimer l'association de collecte de schéma de cette colonne
  2. Laissez tomber l'objet de collection de schémas
  3. collection de schémas Recréer
  4. colonne de table Alter à réassocier collection de schémas à cette colonne.

Ceci est la douleur quand il s'agit de 100+ des régimes dans une collection. Aussi, vous devez recréer les index XML une fois de plus, le cas échéant.

Toutes les solutions, des suggestions, des astuces pour faire cet objet collection schéma processus d'édition plus facile?

Était-ce utile?

La solution

Je suis d'accord avec David que XML n'est pas la panacée on nous a dit que ce serait, mais il y a des situations où il est soit inévitable ou le meilleur outil pour le travail. l'entretien du schéma est douloureux bien. Je n'ai que deux à traiter et encore perdre des heures.

Ce script peut aider. Il génère les gouttes de table et ajoute que vous aurez besoin. Il devrait mdified d'inclure ou d'autres objets UDFs qui pourraient faire référence au schéma XML. Pour générer les instructions de schéma Add, je vous suggère d'utiliser la fonction « Générer des scripts ... » dans le menu Tâches dans Mgt Studio et les enregistrer au large pour l'étape 2 du 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

it helps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top