Есть ли способ наложить ограничение на тип XML для типизированного столбца XML в SQL Server? - PullRequest
1 голос
/ 14 февраля 2012

У меня есть две XML-схемы, где одна зависит от другой, и я хотел бы создать типизированный XML-столбец в SQL Server, где тип определяется одной из моих схем (на самом деле у меня есть сотни схем, но в принципе этотот же самый).Когда я создаю столбец, он принимает все типы, определенные во всей моей коллекции схем, и я действительно хотел бы ограничить тип для одного столбца только одним из типов.

<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

Я думаю, это может подойти, даже если это не так хорошо.: -)

...