2009-05-15 19 views
1

の定義は、ここで私はのためのスキーマを作成しようとしているサンプルXML文書です:SQL 2005 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値に数字を使用することはできません。

いずれかが不足しているか、できないかのいずれかです。不可能な場合、SQL 2005はユニークな属性を持つ機能をサポートしていないのはなぜですか?テーブル上の制約\トリガーまたはxmlインデックスを使用して回避する方法がありますか、または私が今でも想像することのできない他の方法がありますか?

すべてのサポートをよろしくお願いいたします。ここで

答えて

1

は( "キー" も動作します)"unique"を使用してソリューションです:

<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> 
    

    EDIT

はここにあなたの例えばプラスのテストです。それは機能しますが、よりシンプルで簡単な方法があると思います。

+0

です私が強制する必要のあるルールは、SQL Server 2005では動作しません。「一意」は明らかにサポートされておらず、どちらも「キー」ではありません。 – Sheki

+0

:-(本当ですか?しかし、それは仕様です - 私が与えたリンクを見てください...それは "第2版"のためのものです、おそらく初版のみをサポートしているのでしょうか?いいえ - /www.w3.org/TR/2001/REC-xmlschema-1-20010502/#cIdentity-constraint_Definitions だから、彼らは単に仕様全体を実装していなかったと思います。 – 13ren

+0

私の質問はまだそこにあるので、どのように強制することができますか ",,、、および SQL Serverはこれらをサポートしていません。" ...ここを参照http://technet.microsoft.com /en-us/library/ms190665(SQL.90).aspx – Sheki

0

これは古い投稿ですが、ユニークな構文がサポートされていないため、今でもなお関連しています(また、以下の回答をする必要はありません)。

あなたが行う必要があるのは、一意にしたい値を引き出すスキーマ結合スカラー関数を作成することです。

次に、xml列を含むテーブルに永続計算列を作成します。この計算列は、上で定義したスキーマ結合関数を実行します。

最後に、永続化された計算列に一意制約を定義します。今では、ユニークな保証だけでなく、高速検索のために索引付けされています。

EDIT - これは、複数の行で一意である必要があり、トップレベルの属性のために

動作します。

単一のxmlドキュメントの要素のコレクション内で一意性が必要な場合は、同様のアプローチです。

パラメータとしてxmlデータ型を取り、戻り値がBITの関数を作成します。

次に、xmlデータ型でxpathを使用して、独自性をチェックします。値が一意リターン1であれば、そうでない場合は0

を返す最後に、スカラー関数を呼び出し、その結果を検証し、テーブルにチェック制約を追加するには、ソリューションが有効なXSDで、達成するであろうけれども1.