Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 有没有办法对SQL Server中类型化XML列的XML类型施加限制?_Sql Server_Xml_Xml Schema Collection - Fatal编程技术网

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

Sql server 有没有办法对SQL Server中类型化XML列的XML类型施加限制?,sql-server,xml,xml-schema-collection,Sql Server,Xml,Xml Schema Collection,我有两个XML模式,其中一个依赖于另一个,我想在SQL Server中创建一个类型化XML列,其中类型由我的一个模式定义(实际上我有数百个模式,但原则上是相同的)。当我创建列时,它接受在整个模式集合中定义的所有类型,我真的希望将一个列的类型限制为其中一个类型 <schema targetnamespace="b"> <simpleType name="b"> <restriction base="string"><pattern va

我有两个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>
现在,我可以将值插入XML类型“a”和“b”的列中,但我确实希望将列类型限制为仅“a”

除了为每种不同类型手工编写定制的模式集合之外,还有什么方法可以实现这一点吗

更新:

关于建议的检查约束-根据 然后,检查约束将是沿着

CREATE FUNCTION dbo.checkTopElmntIsTypeA(@x XML(MySchemaCollection))
RETURNS bit
AS
BEGIN
    RETURN ~(@x.exist('/a:a'))
END
go
-表定义将列的内容限制为XML类型a

CREATE TABLE T(xmlCol XML(MySchemaCollection)
    CHECK (1 = dbo.checkTopElmntIsTypeA(xmlCol)))
go

我想那也行,即使不是很好。:-)

你考虑过支票约束吗?嗯,是和否;)我自己也没有想到,但当我在谷歌上搜索时,结果中的某个地方建议了一个检查约束。虽然我觉得它不是很优雅,但我真的不是SQL(服务器)方面的专家。我再看一眼。呃,这里不能写代码。。。
CREATE FUNCTION dbo.checkTopElmntIsTypeA(@x XML(MySchemaCollection))
RETURNS bit
AS
BEGIN
    RETURN ~(@x.exist('/a:a'))
END
go
CREATE TABLE T(xmlCol XML(MySchemaCollection)
    CHECK (1 = dbo.checkTopElmntIsTypeA(xmlCol)))
go