2010-02-11 31 views
13

Bộ sưu tập lược đồ XML máy chủ SQL là một khái niệm thú vị và tôi thấy nó rất hữu ích khi thiết kế nội dung dữ liệu động. Tuy nhiên khi tôi làm việc theo cách của mình thông qua việc triển khai Bộ sưu tập lược đồ, tôi thấy rất khó để duy trì chúng.Sửa đổi Bộ sưu tập giản đồ SQL Server

Bộ sưu tập lược đồ DDL chỉ cho phép các nút CREATE và ALTER/ADD cho các sơ đồ hiện có.

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

Khi bạn muốn loại bỏ bất kỳ nút nào khỏi lược đồ bạn phải phát hành sau DDL.

  1. Nếu mà bộ sưu tập sơ đồ giao cho một cột trong bảng, bạn phải thay đổi bảng để loại bỏ hiệp hội sưu tập đồ từ cột đó
  2. Thả bộ sưu tập schema object
  3. Tái Tạo bộ sưu tập đồ
  4. Alter bảng để liên kết lại bộ sưu tập lược đồ với cột đó.

Đây là nỗi đau khi nói đến hơn 100 đề án trong bộ sưu tập. Ngoài ra, bạn phải tạo lại các chỉ mục XML một lần nữa, nếu có.

Bất kỳ giải pháp, đề xuất, thủ thuật nào để làm cho quá trình chỉnh sửa đối tượng thu thập lược đồ này trở nên dễ dàng hơn?

+0

Câu hỏi hay. Tôi luôn muốn biết chính xác ALTER/ADD hoạt động như thế nào, và cách nó thao tác với XML ban đầu – devio

+1

đó là loại hỗ trợ nghèo nàn này cho các kiểu XML trong SQL Server 2005 đã khiến chúng ta di chuyển khỏi chúng. Họ có vẻ gọn gàng, nhưng có một tải toàn bộ các vấn đề tiếp tục xuống đường. Những điều tồi tệ nhất đối với chúng tôi là: không có khả năng sử dụng một bảng với các cột kiểu XML trong một truy vấn phân tán (máy chủ được liên kết); và các cột được tính toán khó có thể viết được vì thứ tự thiếu. Chỉ cần nói không và làm quan hệ thuần túy. –

Trả lời

3

Tôi đồng ý với David rằng XML không phải là thuốc chữa bách bệnh mà chúng tôi đã nói, nhưng có một số trường hợp không thể tránh khỏi hoặc công cụ tốt nhất cho công việc. Tuy nhiên, việc bảo trì lược đồ là rất đau đớn. Tôi chỉ có một cặp để đối phó và vẫn mất giờ.

Tập lệnh này có thể hữu ích. Nó tạo ra các bảng giảm và thêm vào bạn sẽ cần. Nó sẽ cần phải mdified để bao gồm UDF hoặc các đối tượng khác có thể tham khảo lược đồ XML. Để tạo các câu lệnh Add schema, tôi đề nghị bạn sử dụng chức năng "Generate Scripts ..." trong menu tác vụ trong Mgt Studio và lưu chúng lại cho Bước 2 của kịch bản lệnh.

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 

Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn rất nhiều. Tôi sẽ cung cấp cho giải pháp của bạn một thử ngay khi có thể. – mevdiven

Các vấn đề liên quan