У меня есть две 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
Я думаю, это может подойти, даже если это не так хорошо.: -)