2011-07-18 10 views
2

J'ai une table dans une base de données SQL Server. Il a une clé naturelle en deux parties sur Location (un entier) et CaseNumber (également un entier). Lorsque je crée un nouvel enregistrement, je veux spécifier l'emplacement et avoir le numéro de dossier généré pour moi afin que, pour un emplacement, tous les numéros de cas soient uniques, incrémentiels et sans lacunes. Les enregistrements de la table ne seront jamais supprimés.Créer un numéro d'incrémentation basé sur une autre colonne pour former une clé en deux parties

Quelle serait la meilleure façon de le faire pour s'assurer qu'il est sécuritaire pour les mises à jour simultanées?

+1

Après quelques recherches, je trouve [cette réponse] (http://stackoverflow.com/questions/1223287/per-entity-autoincrement-field-in-sql-server) . Il semble qu'il n'y a rien sans réponse sur SO :) – Jacob

Répondre

0

Cela a été couvert avant, mais voici quelques idées générales:

Ajouter un UNIQUE INDEX couvrant Location, CaseNumber. Cela empêchera les dupes si vos vérifications de concurrence échouent.

Encapsuler votre code pour vérifier/insérer la nouvelle valeur max dans une transaction. Ce n'est pas joli mais c'est comment vous pouvez vous assurer qu'il n'y aura pas de problèmes avec la concurrence.

.. à savoir

DECLARE @Max int 
BEGIN TRAN 
SET @Max = (SELECT MAX(CaseNumber) FROM MyTable WITH (TABLOCK) 
      WHERE Location = @Location) + 1 

INSERT INTO MyTable 
@Location, @Max 

COMMIT TRAN 
Questions connexes