Génération d'ID à incrémentation automatique dans SQL Server 2005 sans ORDER BY
La nécessité d'insérer des données d'une table dans une autre lors de l'auto-incrémentation une colonne sans identité peut être un défi. L'approche standard consiste à utiliser un curseur ou à créer une variable de table, mais celles-ci peuvent être inefficaces.
En l'absence de champ ORDER BY légitime, la fonction ROW_NUMBER peut être utilisée. Cependant, l’absence d’ordre explicite ne garantit pas la préservation de l’ordre original des données. En effet, « non commandé » est distinct de « conserver l'ordre d'origine ».
Pour résoudre ce problème, une solution consiste à éviter la commande explicite comme suit :
INSERT dbo.TargetTable (ID, FIELD) SELECT Row_Number() OVER (ORDER BY (SELECT 1)) + Coalesce( (SELECT Max(ID) FROM dbo.TargetTable WITH (TABLOCKX, HOLDLOCK)), 0 ), FieldValue FROM dbo.SourceTable WHERE {somecondition};
Cette approche calcule le Max ID et insère des données lors de l'acquisition de verrous pour éviter les erreurs de concurrence.
Cependant, notez que l'utilisation d'une colonne d'identité est fortement recommandée car elle élimine le besoin de verrouillage et garantit une concurrence. Les colonnes d'identité offrent une solution plus efficace et plus robuste pour l'incrémentation automatique des identifiants dans SQL Server.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!