1

这是我正在尝试为其创建架构的示例 xml 文档:

'<Fields>
  <Field ID="-1">somevalue</Field>
  <Field ID="-2" />
  <Field ID="-3" />
  <Field ID="-4">Some other value</Field>
  <Field ID="-5" />
</Fields>'

我正在尝试创建一个 SQL Server 2005 架构集合以:
1. 防止重复 ID。
2. 只允许负ID。

我可以使用 id 属性的 type="xs:negativeInteger" 来实现负约束。但是我不能在 SQL 2005 中创建唯一约束或 key\keyref。如果我设置我的 type="xs:ID",那么我根本不能使用数字作为我的 ID 值,更不用说负 ID。

要么我错过了什么,要么不可能。如果不可能,为什么 SQL 2005 不支持拥有唯一属性的能力?是否可以在表上使用约束\触发器或 xml 索引,或者我现在无法想象的其他一些技术?

非常感谢所有帮助。

4

2 回答 2

1

这是使用“唯一”的解决方案(“密钥”也可以):

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Fields">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="Field"/>
      </xs:sequence>
    </xs:complexType>

    <xs:unique name="nearlyID">
      <xs:selector xpath=".//*"/>  
      <xs:field xpath="@ID"/>
    </xs:unique>
  </xs:element>


  <xs:element name="Field">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:string">
          <xs:attribute name="ID" type="xs:negativeInteger"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

它验证您的示例,并给出以下错误:

  1. 重复的身份证
  2. id 不是负整数。

这是您的 eg plus 测试:

<Fields>
  <Field ID="-1">somevalue</Field>
  <Field ID="-2" />
  <Field ID="-3" />
  <Field ID="-4">Some other value</Field>
  <Field ID="-5" />

  <Field ID="-2"   >  not unique   </Field>
  <Field ID="2"    >  not negative </Field>
  <Field ID="hello">  not integer  </Field>
</Fields>

编辑我不知道这是否是最好的方法,或者即使它是一个好方法。它有效,但我认为可能有一种更简单、更直接的方法。

于 2009-05-16T03:33:50.833 回答
0

这是一篇旧文章,但今天仍然相关,因为不支持独特的语法(并且不需要下面的答案)。

您需要做的是创建一个模式绑定标量函数,该函数将提取您希望唯一的值。

然后在包含 xml 列的表上创建一个持久计算列。这个计算列将执行上面定义的模式绑定函数。

最后,您在持久计算列上定义唯一约束。现在它不仅保证了唯一性,而且还为快速搜索建立了索引。

编辑 -

这适用于需要在多行中唯一的顶级属性。

如果您需要在单个 xml 文档中的元素集合中具有唯一性,则方法类似。

您创建了一个函数,该函数将 xml 数据类型作为参数,并具有返回值 BIT。

然后,您在 xml 数据类型上使用 xpath 来自己检查唯一性。如果值是唯一的,则返回 1,否则返回 0。

最后,向调用标量函数的表添加检查约束并验证结果为 1。

于 2017-01-25T21:08:21.667 回答