比较更新脚本的xml架构列

时间:2014-07-25 14:09:46

标签: sql tsql

有没有办法比较两个xml列模式,以便我可以触发该列的架构更新?

我知道如何查询模式的存在,但无论如何我可以将它与我可能更新的模式进行比较吗?

select C2.name
from sys.columns as C1
  inner join sys.xml_schema_collections as C2
    on C1.xml_collection_id = C2.xml_collection_id
where C1.object_id = object_id('TableName') and
      C1.name = 'ColumnName' and C2.name = 'SchemaName'

喜欢它会这样工作:

IF NOT EXISTS (< Actual schema compare >)
BEGIN
    --ALTER COLUMN to xml
    --DROP SCHEMA
    --CREATE SCHEMA
    --ALTER COLUMN to xml with schema again
END

1 个答案:

答案 0 :(得分:1)

xml_schema_namespace将以XML格式为您提供集合中的模式。

存储在SQL Server中的XML与用于创建架构的版本不完全相同。删除了注释,空格和注释,因此您必须在SQL Server中为要比较的模式创建临时集合,并使用xml_schema_namespace提取该模式。 XML无法直接比较,因此您必须在比较架构集合之前将XML转换为nvarchar(max)

检查架构排序规则的存储过程可能如下所示。

create procedure dbo.CompareSchema 
  @NewSchema xml,
  @RelationalSchema sysname,
  @XMLSchemaCollectionName sysname,
  @Diff bit out
as
begin
  create xml schema collection dbo.__TempCollaction as @NewSchema;

  if cast(xml_schema_namespace(@RelationalSchema, @XMLSchemaCollectionName) as nvarchar(max)) = 
       cast(xml_schema_namespace('dbo', '__TempCollaction') as nvarchar(max))
    set @Diff = 0;
  else
    set @Diff = 1;   

  drop xml schema collection dbo.__TempCollaction;
end