Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

maintenir une colonne d'incrémentation automatique personnalisée

Le problème est que lorsque plusieurs lignes sont insérées, vous utilisez le même ID disponible suivant pour toutes les lignes, vous devez ajouter ROW_NUMBER() pour s'assurer que le xid était unique dans l'insert :

insert into [xtable] (XID)
select [x].[NextavailableID] + ROW_NUMBER() OVER (ORDER BY i.ID)
from inserted [i]
cross apply
(
  select coalesce(max([t].[XID]), 0) [NextavailableID]
  from [xtable] [t] WITH (TABLOCK, HOLDLOCK)
) [x];

En ce qui concerne la prévention des doublons, vous pouvez utiliser des conseils de table pour verrouiller xtable lors de l'obtention du maximum xid .

L'inconvénient d'utiliser ces verrous est que vous obtiendrez un blocage. Vous devriez avoir une contrainte/un index unique sur cette colonne car cela empêchera les doublons, mais cela entraînera également des exceptions lorsqu'une condition de concurrence est remplie. En fin de compte, quelle que soit la méthode que vous choisissez, vous devrez faire une sorte de sacrifice.