문제

SQL Server XML 스키마 컬렉션은 흥미로운 개념이며 동적 데이터 콘텐츠를 디자인할 때 매우 유용하다고 생각합니다.그러나 스키마 컬렉션을 구현하면서 이를 유지 관리하는 것이 매우 어렵다는 것을 알게 되었습니다.

스키마 컬렉션 DDL은 기존 구성표에 대한 CREATE 및 ALTER/ADD 노드만 허용합니다.

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이 우리가 말한 만병통치약은 아니지만, XML이 불가피하거나 작업에 가장 적합한 도구인 상황이 있다는 David의 의견에 동의합니다.하지만 스키마 유지 관리는 고통스럽습니다.처리해야 할 일이 몇 개 밖에 없는데 여전히 시간을 낭비합니다.

이 스크립트가 도움이 될 수 있습니다.테이블 드롭을 생성하고 필요한 추가 기능을 제공합니다.XML 스키마를 참조할 수 있는 UDF 또는 기타 개체를 포함하도록 수정해야 합니다.스키마 추가 문을 생성하려면 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