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. 重複したID
  2. 負の整数ではない ID。

これがあなたの例とテストです:

<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 に答える