2009-05-15 4 views
1

Hier ist ein Beispiel-XML-Dokument Ich versuche, ein Schema zu erstellen:SQL 2005 XML-Schemas - Definieren eines einzigartigen Attribut

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

Ich versuche, eine SQL Server 2005-Schemaauflistung zu erstellen:
1. verhindere doppelte ID's.
2. Nur negative IDs zulassen. ": Negative xs" für das id-Attribut

Ich kann die negative Einschränkung mit type = erreichen. Aber ich kann keine eindeutige Einschränkung oder key \ keyref in SQL 2005 erstellen. Wenn ich meine type = "xs: ID" setze, dann kann ich überhaupt keine Zahlen für meine ID-Werte verwenden, keine negativen IDs.

Entweder fehlt mir etwas, oder es ist nicht möglich. Wenn dies nicht möglich ist, warum würde SQL 2005 die Fähigkeit, ein eindeutiges Attribut zu haben, nicht unterstützen? Gibt es eine Arbeit um einen constraint \ trigger oder einen xml Index auf dem Tisch zu benutzen, oder eine andere Technik die ich mir momentan nicht vorstellen kann?

Alle Hilfe wird sehr geschätzt.

Antwort

1

Hier ist eine Lösung mit "unique" ("Schlüssel" funktioniert auch):

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

Es bestätigt Ihr Beispiel und gibt Fehler für:

  1. doppelten ids
  2. Ids, die nicht negative ganze Zahlen.

Hier ist Ihr zB mit Prüfungen:

<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 Ich habe keine Ahnung, ob dies der beste Weg ist, oder auch wenn es ein guter Weg. Es funktioniert, aber ich denke, dass es einen einfacheren, einfacheren Weg gibt.

+0

Obwohl Ihre Lösung gültig XSD und würde erreichen Die Regeln, die ich erzwingen muss, funktionieren nicht mit SQL Server 2005. "unique" wird offensichtlich nicht unterstützt, auch nicht "key". – Sheki

+0

:-(wirklich? Aber es ist in der Spezifikation - siehe den Link, den ich gab. Uh ... das ist für die "zweite Ausgabe", vielleicht unterstützen sie nur die erste Ausgabe? Nein - es hat auch einzigartige/Schlüssel: http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/#cIdentity-constraint_Definitions Also ich denke, sie haben einfach nicht die ganze Spezifikation implementiert. – 13ren

+0

so meine Frage ist immer noch da draußen, wie kann ich erzwingen dass meine ID in SQL 2005 eindeutig und negativ ist. ", , , und SQL Server unterstützt diese nicht." ... siehe hier http://technet.microsoft.com /en-us/library/ms190665(SQL.90).aspx – Sheki

0

Dies ist eine alte Post, aber auch heute noch aktuell, wie die eindeutige Syntax wird nicht unterstützt (und muss nicht unter der Antwort sein).

Was müssen Sie tun, ist ein Schema gebunden Skalarfunktion erstellen, die den Wert, den Sie einzigartig sein wollen herausziehen.

Dann erstellen Sie eine beharrte berechnete Spalte auf dem Tisch der XML-Spalte enthält. Diese berechnete Spalte führt die oben definierte schemabegrenzte Funktion aus.

Schließlich definieren Sie eine eindeutige Integritätsbedingung für die persistente berechnete Spalte. Jetzt ist es nicht nur garantiert einzigartig, sondern auch indexiert für schnelles Suchen.

EDIT -

Diese für Top-Level-Attribute funktioniert, die sich über mehrere Zeilen eindeutig sein müssen.

Wenn Sie innerhalb einer Sammlung von Elementen in einem einzigen XML-Dokument Einzigartigkeit benötigt, ist der Ansatz ähnlich.

Sie erstellen eine Funktion, die den XML-Datentyp als Parameter verwendet und einen Rückgabewert von BIT hat.

Anschließend verwenden Sie xpath für den Datentyp xml, um die Eindeutigkeit selbst zu überprüfen. Wenn die Werte eindeutig sind Rückkehr 1, wenn nicht 0.

Schließlich zurückzukehren, fügen Sie eine Check-Einschränkung auf die Tabelle, die die Skalar-Funktion aufruft und überprüft das Ergebnis 1.