修改 SQL Server 架构集合

Posted

技术标签:

【中文标题】修改 SQL Server 架构集合【英文标题】:Modifying SQL Server Schema Collection 【发布时间】:2010-02-11 17:05:44 【问题描述】:

SQL Server XML Schema Collection 是一个有趣的概念,我发现它在设计动态数据内容时非常有用。然而,当我通过实现 Schema Collections 的方式工作时,我发现维护它们非常困难。

Schema Collection 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。

    如果该架构集合分配给表列,您必须更改表以从该列中删除架构集合关联 删除架构集合对象 重新创建架构集合 更改表列以将架构集合重新关联到该列。

当涉及到一个集合中的 100 多个方案时,这很痛苦。如果有的话,您还必须重新创建 XML 索引。

有什么解决方案、建议和技巧可以让这个模式集合对象的编辑过程更容易吗?

【问题讨论】:

好问题。我一直想知道 ALTER/ADD 究竟是如何工作的,以及它是如何操作原始 XML 的 SQL Server 2005 中对 XML 类型的这种糟糕的支持使我们远离它们。它们看起来很整洁,但在未来还有一大堆问题。对我们来说最糟糕的是:无法在分布式查询(链接服务器)中使用带有 XML 类型列的表;由于依赖顺序,计算列难以编写脚本。说不,做纯粹的关系。 【参考方案1】:

我同意 David 的观点,即 XML 不是我们被告知的万灵药,但在某些情况下它要么是不可避免的,要么是完成这项工作的最佳工具。架构维护虽然很痛苦。我只有一对夫妇要处理,而且仍然浪费时间。

这个脚本可能会有所帮助。它会生成表格并添加您需要的内容。它需要修改以包含 UDF 或其他可能引用 XML 模式的对象。要生成 Add schema 语句,我建议您使用 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].['+@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

希望对你有帮助。

【讨论】:

非常感谢。我会尽快尝试您的解决方案。

以上是关于修改 SQL Server 架构集合的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver 怎么 修改数据

如何在 SQL Server 表中添加“最后修改”和“创建”列?

设置Sql server用户对表视图存储过程架构的增删改查权限

SQL Server 架构集合中的可重用 simpleType 定义

SQL Server基础之存储过程

SQL Server基础之存储过程