تعديل مجموعة مخطط SQL Server
-
20-09-2019 - |
سؤال
مجموعة 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.
- إذا كانت هذه مجموعة المخطط المعينة إلى عمود جدول، يجب عليك تغيير الجدول لإزالة جمعية مجموعة المخطط من هذا العمود
- إسقاط كائن جمع المخطط
- إعادة إنشاء مجموعة مخطط
- تغيير عمود الجدول لإعادة تعيين مجموعة مخطط إلى هذا العمود.
هذا ألم عندما يتعلق الأمر بمبلغ 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
آمل أن يساعد.