我有两个 XML 架构,其中一个依赖于另一个,我想在 SQL Server 中创建一个类型化的 XML 列,其中类型由我的一个架构定义(实际上我有数百个架构,但原则上是相同的) . 当我创建列时,它接受在我的整个模式集合中定义的所有类型,我真的很想将一列的类型限制为其中一种类型。
<schema targetnamespace="b">
<simpleType name="b">
<restriction base="string"><pattern value="(0[1-9])"/></restriction>
</simpleType>
</schema>
<schema targetnamespace="a" xmlns:b="b">
<element name="b" type="b:b" />
<complexType name="aType">
<sequence>
<element ref="b"/>
</sequence>
</complexType>
<element name="a" type="aType"/>
</schema>
所以首先我创建了模式集合
CREATE XML SCHEMA COLLECTION Foo AS N'<above schemas>'
然后我创建列
ALTER TABLE FooTable ADD fooCol [xml] (Document [Foo])
现在我可以将值插入到 XML 类型“a”和“b”的列中,但我真的很想将列类型限制为“a”。
除了为每种不同类型手写自定义模式集合之外,有没有什么方法可以实现这一点?
更新:
关于建议的检查约束-根据http://blogs.msdn.com/b/denisruc/archive/2006/08/22/713342.aspx ,检查约束将类似于以下内容
CREATE FUNCTION dbo.checkTopElmntIsTypeA(@x XML(MySchemaCollection))
RETURNS bit
AS
BEGIN
RETURN ~(@x.exist('/a:a'))
END
go
- 以及将列内容限制为 XML 类型的表定义
CREATE TABLE T(xmlCol XML(MySchemaCollection)
CHECK (1 = dbo.checkTopElmntIsTypeA(xmlCol)))
go
我想这可以做到,即使它不是那么好。:-)