2009-05-15 4 views
1

Voici un document XML exemple, je suis en train de créer un schéma pour:SQL 2005 XML Schemas - Définition d'un attribut unique

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

Je suis en train de créer une collection de schémas SQL Server 2005:
1. éviter les ID dupicés.
2. n'autoriser que les identifiants négatifs.

Je peux obtenir la contrainte négative avec type = "xs: negativeInteger" pour l'attribut id. Mais je ne peux pas créer une contrainte unique ou key \ keyref dans SQL 2005. Si je mets mon type = "xs: ID", alors je ne peux pas utiliser de nombres pour mes valeurs d'ID, nevermind les ID négatifs.

Soit il me manque quelque chose, soit ce n'est pas possible. Si ce n'est pas possible, pourquoi SQL 2005 ne supporte pas la possibilité d'avoir un attribut unique? Y at-il un travail autour de l'utilisation d'une contrainte \ trigger ou d'un index xml sur la table, ou d'une autre technique que je ne peux même pas imaginer maintenant?

Toute aide est grandement appréciée.

Répondre

1

est ici une solution à l'aide "unique" ("clé" fonctionne aussi):

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

Il valide votre exemple, et donne des erreurs pour:

  1. Dupliquons id
  2. id qui ne sont pas entiers négatifs.

Voici votre exemple, plus des tests:

<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 Je ne sais pas si cela est la meilleure façon ou même si elle est une bonne façon. Cela fonctionne, mais je pense qu'il pourrait y avoir une façon plus simple et plus directe.

+0

Bien que votre solution est xsd valide et réaliserait les règles que je dois appliquer, cela ne fonctionne pas avec SQL Server 2005. 'unique' n'est pas supporté apparemment, ni 'key' non plus. – Sheki

+0

:-(vraiment? Mais c'est dans la spécification - voir le lien que j'ai donné ... euh ... c'est pour la "deuxième édition", peut-être qu'ils ne soutiennent que la première édition? Non - il a aussi unique/clé: http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/#cIdentity-constraint_Definitions Donc je suppose qu'ils n'ont tout simplement pas implémenté toute la spécification – 13ren

+0

donc ma question est toujours là, comment puis-je appliquer que mon ID est unique et négatif dans SQL 2005. ", , , et SQL Server ne les prend pas en charge." ... voir ici http://technet.microsoft.com /en-us/library/ms190665(SQL.90).aspx – Sheki

0

Ceci est un ancien article, mais toujours d'actualité aujourd'hui car la syntaxe unique n'est pas supportée (et n'a pas besoin d'être avec la réponse ci-dessous).

Ce que vous devez faire est de créer une fonction scalaire liée au schéma qui va extraire la valeur que vous voulez être unique.

Ensuite, vous créez une colonne calculée persistante sur la table contenant la colonne xml. Cette colonne calculée exécutera la fonction liée au schéma définie ci-dessus.

Enfin, vous définissez une contrainte unique sur la colonne calculée persistante. Maintenant, il est non seulement garanti unique, mais aussi indexé pour une recherche rapide.

EDIT -

Cela fonctionne pour les attributs de haut niveau qui ont besoin d'être unique sur plusieurs lignes.

Si vous avez besoin d'unicité au sein d'une collection d'éléments dans un même document XML, l'approche est similaire.

Vous créez une fonction qui prend le type de données xml en paramètre et qui a une valeur de retour de BIT.

Vous utilisez ensuite xpath sur le type de données xml pour vérifier vous-même l'unicité. Si les valeurs sont uniques retour 1, sinon retour 0.

Enfin, vous ajoutez une contrainte de vérification à la table qui appelle la fonction scalaire et vérifie le résultat est 1.

Questions connexes