2010-02-11 3 views
13

SQL Server XML 스키마 컬렉션은 흥미로운 개념이며 동적 데이터 콘텐츠를 디자인 할 때 매우 유용합니다. 그러나 Schema Collections 구현을 통해 작업하면서 스키마를 유지 관리하는 것은 매우 어렵습니다.SQL Server 스키마 컬렉션 수정

스키마 컬렉션 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 인덱스를 다시 작성해야합니다.

이 스키마 컬렉션 개체 편집 과정을 쉽게 만드는 방법, 제안 사항 및 트릭은 무엇입니까?

+0

좋은 질문입니다. 항상 ALTER/ADD가 어떻게 작동하는지, 원래 XML을 조작하는 방법을 알고 싶었습니다. – devio

+1

SQL Server 2005의 XML 형식에 대한 이러한 종류의 지원이 부족하기 때문에 이러한 문제가 해결되었습니다. 그들은 깔끔하게 보입니다.하지만 길 아래로 더 많은 문제가 있습니다. 최악의 경우는 분산 쿼리 (연결된 서버)에서 XML 형식 열이있는 테이블을 사용할 수 없다는 것입니다. 그리고 계산 열은 독창성 순서로 인해 스크립트하기가 어렵습니다. 그냥 no라고 말하고 순수한 관계형을 사용하십시오. –

답변

3

David는 XML이 우리가 말한 만병 통치약이 아니라는 점에 동의합니다.하지만 일을하는 데 피할 수없는 최선의 도구가있는 상황이 있습니다. 스키마 유지 관리는 어렵습니다. 나는 몇 시간 만 다룰 수 있고 여전히 시간을 잃어버린다.

이 스크립트가 도움이 될 수 있습니다. 그것은 테이블 방울을 생성하고 당신이 필요로 추가합니다. UDF 또는 XML 스키마를 참조 할 수있는 기타 오브젝트를 포함하도록 mdified해야합니다. Add 스키마 문을 생성하려면 Mgt Studio의 작업 메뉴에서 "Generate Scripts ..."기능을 사용하고 스크립트의 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].['[email protected]+']' 

    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 

희망이 있습니다.

+0

고마워요. 가능한 한 빨리 해결책을 드릴 것입니다. – mevdiven