Frage

SQL Server XML-Schema-Collection ist ein interessantes Konzept, und ich finde es sehr nützlich, wenn dynamischen Dateninhalt zu entwerfen. Doch als ich meinen Weg durch Schema Kollektionen Umsetzung, finde ich es sehr schwierig, sie zu halten.

Schemaauflistung DDL ermöglicht CREATE nur und ALTER / ADD Knoten an bestehende Systeme.

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

Wenn Sie einen beliebigen Knoten aus einem Schema entfernen möchten Sie Problem haben die folgende DDL.

  1. Wenn das Schemaauflistung einer Tabellenspalte zugeordnet, müssen Sie alter table-Schemaauflistung Verein aus dieser Spalte
  2. entfernen
  3. Drop das Schema Sammelobjekt
  4. Re-Create Schema Sammlung
  5. Alter Tabellenspalte re-associate Schema Sammlung zu dieser Spalte.

Dies ist der Schmerz, wenn es um mehr als 100 von Systemen in einer Sammlung kommt. Außerdem müssen Sie XML-Indizes neu erstellen alle immer wieder, wenn überhaupt.

Jede Lösungen, Vorschläge, Tricks dieses Schema Sammelobjekt machen Prozess Bearbeitung zu erleichtern?

War es hilfreich?

Lösung

ich mit David einig, dass XML ist nicht das Allheilmittel wurde uns gesagt, es wäre, aber es gibt einige Situationen, in denen es entweder unvermeidbar ist oder das beste Werkzeug für den Job. Schema Wartung ist schmerzhaft, aber. Ich habe nur ein paar mit und noch verlieren Stunden zu bearbeiten.

Dieses Skript könnte helfen. Er erzeugt den Tabellentropfen und fügt die Sie benötigen. Es müssten mdified UDF oder andere Objekte enthalten, die das XML-Schema verweisen könnte. Um die Add-Schema-Anweisungen zu generieren, ich schlage vor, Sie verwenden die „Skripts generieren ...“ -Funktion im Menü Aufgaben in Mgt Studio und speichern sie ab für Schritt 2 des Skripts.

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

Hope es hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top