crn_c21
Messages postés302Date d'inscriptionsamedi 24 janvier 2004StatutMembreDernière intervention 4 février 2011
-
24 oct. 2008 à 15:47
crn_c21
Messages postés302Date d'inscriptionsamedi 24 janvier 2004StatutMembreDernière intervention 4 février 2011
-
26 oct. 2008 à 20:29
Bonjour,
Dans une table SQL 2005, j'ai un champ IdRlt(clè primaire).Dans ce champ, j'ajoute et je supprime des lignes très régulièrement et je dois donc chercher avant de faire une nouvelle insertion le premier identifiant "libre". Dans une procédure stockée, je cherche le premier identifiant libre à partir de 1 et tant que je ne trouve pas , j'incrémente de 1.
Mon problème est que cette table possède plusieurs millions d'enregistrements et que la procédure stockée est très longue .
Quelqu'un aurait-il une autre idée pour rechercher le premier IdRlt "libre"?
crn_c21
Messages postés302Date d'inscriptionsamedi 24 janvier 2004StatutMembreDernière intervention 4 février 2011 26 oct. 2008 à 20:29
Merci pour cette réponse, je vais approfondir!
le besoin se fait sentir car la base de données est parcouru par un programme VB6(dont nous n'avons plus les sources!! et développer par un bricoleur) où bcp de variables sont déclarées en Integer (donc limité à 32568 me semble-t-il)
Une solution transitoire m'est venu(sous la douche!! lol).Puisque je supprime bcp d'enregistrement,j'ai mis un trigger sur le Deleted qui insert l'Id dans une table annexe. Cette table reprend les Id "libres".
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 26 oct. 2008 à 16:47
Salut,
As tu vraiment besoin de combler les trous ?
Si oui, essaie de faire quelquechose autour de cette requête là, basée sur une CTE et ROW_NUMBER (exemple basé sur la table [Person].[Address] de la base AdventureWorks) :
WITH IDsAndRowNumbers AS
(
SELECT [AddressID] AS ID,
ROW_NUMBER() OVER (ORDER BY [AddressID] ASC) AS RowNumber
FROM [Person].[Address]
)
SELECT TOP 1 [ID], [RowNumber]
FROM IDsAndRowNumbers
WHERE [RowNumber]<>[ID]
Cette requête permet de sortir l'ID de la première entrée où le numéro séquentiel généré par ROW_NUMBER est différent du numéro séquentiel de la clé, ce qui indique un gap.
Prévoir ce qu'il faut en sortie pour les cas où aucun gap n'est trouvé, etc etc
Ca devrait mieux tourner qu'un curseur mais je pense qu'en cas d'opérations d'insert intensives tu devras basculer sur une autre stratégie.