Passage Access --> SQL Server

Avatar du membre
ViPHP
ViPHP | 3008 Messages

28 oct. 2005, 11:32

Bonjour tout le monde !

Je dois bientôt migrer Access vers SQL Server. Je dois donc me former étant donné que je n'y connais encore rien lol.

La petite question que je me pose et que je n'ai pas réussi à trouver sur le net, c'est existe-t-il un type "auto_increment" dans SQL comme pour access ou mysql ? Sinon quelle est l'astuce ?

Merci pour le coup de main ! ;)

Mammouth du PHP | 19672 Messages

28 oct. 2005, 11:54

Avec SQL Server, le moins compliqué sera une procédure stockée. Je reprends ici les explications que j,ai dans un bouquin sur le SQL à ce propos.
"...nous construisons une table contenant la valeur de la dernière clé affectée à chacune des tables pour lesqe=uelles on veut ce calcul:

Code : Tout sélectionner

CREATE TABLE SYS_KEYS (KEY_TABLE_NAME CHAR(128) NOT NULL PRIMARY KEY, KEY_KEY_VALUE INTEGER NOT NULL DEFAULT 1)
"Avant toute insertion dans la base, on aura soin d'alimenter cette table avec le nom de toutes les tables qui demandent un tel calcul

Pour notre jeu d'essai, nous ferons la requête suivante :"

Code : Tout sélectionner

INSERT INTO SYS_KEYS SELECT 'nom_table', MAX(champ_id) FROM nom_table
Note : le premier 'nom_table' de la sous-requête est ici une chaine de caractère.
"Dès lors, pour calculer une nouvelle valeur de clef, il nous faut passer en argument de la procédure stockée le nom de la table, et la procédure stockée doit retourner la nouvelle valeur à attribuer. Bien entendu, pour fiabiliser cette opération, nous ferons appel à la transaction du plus haut niveau d'isolation.

Voici le code d'une telle procédure réalisée en TRANSAC SQL, le langage de SQL Server :"

Code : Tout sélectionner

CREATE PROCEDURE CALC_NEW_KEY @NomTable CHAR(128) AS DECLARE @newKey INTEGER -- gestion de la transaction : elle s'appelle CALC_A_KEY -- et son niveau d'isolation est maximal BEGIN TRANSACTION CALC_A_KEY SET TRANSACTION ISOLATION LEVEL SERIALIZABLE -- on calcule la nouvelle clef SELECT @newKey = KEY_KEY_VALUE + 1 FROM SYS_KEYS WHERE KEY_TABLE_NAME = + @NomTable -- on met à jour la table des clefs UPDATE SYS_KEYS SET KEY_KEY_VALUE = @newKey -- on valide la transaction COMMIT TRANSACTION CALC_A_KEY -- on retourne la valeur de la clef SELECT @newKey
"Une telle procédure stockée pourra donc être appelée lors de l'insertion d'une ligne dans une table afin de calculer la nouvelle clef de manière automatique."
Voilà, j'espère que ça te sera utile :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
ViPHP
ViPHP | 3008 Messages

28 oct. 2005, 11:58

Je crois que je vais regretter access et mysql moi :lol:

Merci beaucoup cyrano, je vais essayer de me pencher dessus. je ne mets pas encore le résolu, au cas où (et sûrement) d'autres questions pointeraient leur nez :)

Eléphant du PHP | 219 Messages

28 oct. 2005, 12:37

Pour sqlserver, regarde le mot clé IDENTITY

ViPHP
ViPHP | 1024 Messages

28 oct. 2005, 13:21

comme le dit Daoud, identity is your friend :)

tu fais une migration des données telles quelles ou tu dis modifier le modèle / les données ?

quelques conseils pour migrer:
- vérifier le nombre d'enregistrements dans l'ancienne et la nouvelle base, pour chaque table
- faire le SQL de modification de données sous forme de procédures stockées, qui pourront être appelées via un lot DTS
- faire des fonctions "vider la base" et "recréer les tablesé

Bon courage :)

A+

Pascal

Avatar du membre
ViPHP
ViPHP | 3008 Messages

28 oct. 2005, 14:36

Oki merci à tous ! Je m'y plonge !!!! :wink: