有没有办法比较两个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
答案 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