有没有办法对SQL Server中的类型化XML列的XML类型施加限制?

时间:2012-02-14 13:47:34

标签: sql-server xml xml-schema-collection

我有两个XML Schema,其中一个依赖于另一个,我想在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

我想这可以做到,即使它不太好。 : - )

0 个答案:

没有答案