سؤال

مجموعة SQL Server XML Schema Collection هي مفهوم مثيرة للاهتمام وأجدها مفيدة للغاية عند تصميم محتوى البيانات الديناميكي. ومع ذلك، وأنا أعمل في طريقي من خلال تنفيذ مجموعات المخططات، أجد صعوبة في الحفاظ عليها.

Schema Collection DDL يسمح فقط بإنشاء وتغيير / إضافة العقد إلى المخططات الموجودة.

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

عندما تريد إزالة أي عقدة من مخطط، يجب عليك إصدار ما بعد DDL.

  1. إذا كانت هذه مجموعة المخطط المعينة إلى عمود جدول، يجب عليك تغيير الجدول لإزالة جمعية مجموعة المخطط من هذا العمود
  2. إسقاط كائن جمع المخطط
  3. إعادة إنشاء مجموعة مخطط
  4. تغيير عمود الجدول لإعادة تعيين مجموعة مخطط إلى هذا العمود.

هذا ألم عندما يتعلق الأمر بمبلغ 100+ من المخططات في مجموعة. كما يجب عليك إعادة إنشاء مؤشرات XML مرة أخرى، إن وجدت.

أي حلول، اقتراحات، الحيل لجعل عملية تحرير كائن مجموعة المخطط هذه أسهل؟

هل كانت مفيدة؟

المحلول

وأنا أتفق مع ديفيد أن XML ليس هو panacea قيل لنا أنه سيكون، ولكن هناك بعض المواقف التي تكون فيها إما لا مفر منه أو أفضل أداة لهذا المنصب. صيانة المخطط مؤلمة على الرغم من ذلك. ليس لدي سوى زوجين للتعامل معهم وما زالوا يفقدون ساعات.

قد يساعد هذا البرنامج النصي. إنه يولد قطرات الطاولة ويضيف ستحتاج. ستحتاج إلى medified لتضمين UDFS أو كائنات أخرى قد تشير إلى مخطط XML. لإنشاء بيانات إضافة مخطط، أقترح عليك استخدام وظيفة "إنشاء البرامج النصية ..." في قائمة المهام في MGT Studio وحفظها من الخطوة 2 من البرنامج النصي.

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

آمل أن يساعد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top