J'ai une clé primaire que je ne veux pas incrémenter automatiquement (pour diverses raisons) et donc je cherche un moyen d'incrémenter simplement ce champ quand je l'INSÉRER. Par simplement, je veux dire sans procédures stockées et sans déclencheurs, donc juste une série de commandes SQL (de préférence une commande).Possible d'implémenter un incrément manuel avec simplement SQL INSERT?
Voici ce que j'ai essayé jusqu'ici:
BEGIN TRAN
INSERT INTO Table1(id, data_field)
VALUES ((SELECT (MAX(id) + 1) FROM Table1), '[blob of data]');
COMMIT TRAN;
* Data abstracted to use generic names and identifiers
Cependant, lorsqu'il est exécuté, les erreurs de commande, en disant que
« Les sous-requêtes ne sont pas autorisés dans ce contexte seulement des expressions scalaires. sont autorisés "
Alors, comment puis-je faire ceci/qu'est-ce que je fais mal?
EDIT: Comme il a été souligné comme une considération, la table à insérer dans est la garantie d'avoir au moins 1 rang déjà.
Pourquoi y aurait-il des collisions? De telles choses sont traitées par la transaction, oui? De plus, d'où viendraient les blocages? – cdeszaq
pas si vous exécutez sous le niveau transactionnel par défaut (lire commited), ce qui empêche deux threads de lire la même valeur max? – SQLMenace
Les blocages peuvent être évités en omettant l'indicateur 'Holdlock' –