Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/05/2011, 11h00   #1
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Par défaut fonction génération ID

Bonjour

Je voulais savoir si il serait possible de créer une fonction SQL SERVER qui me récupéré le dernière id de la table en me l’incrémentent de 1.
l'id de la table est un varchar(36) (Je ne peux pas le changer).

merci d'avance.
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 11h09   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par france38 Voir le message
l'id de la table est un varchar(36) (Je ne peux pas le changer).


il faudrait pourtant !

sinon la solution serait quelque chose du genre :
Code SQL :
1
2
3
 
SELECT MAX(CAST(ColonneID AS BIGINT)) + 1
FROM MaTable

m'enfin... déjà qu'avec un bon vieux INT, la méthode n'est pas la mieux, mais alors avec un VARCHAR (de 36 qui plus est ) ça risque d’être catastrophique...

d'autre part, si vous avez réellement des nombre de 36 chiffres, vous allez avoir un dépassement de capacités, même avec un bigint !

que representent ces varchar(36) ?

Quand vous dites que vous ne pouvez pas le changer, ne pouvez vous pas non plus ajouter un colonne INT (ou BIGINT) qui pourrait servir de clef primaire ? ce serait nettement mieux !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/05/2011, 11h24   #3
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Enfaite il faut que je transfert des données d'une base à une autre.
L'ID est normalement générer par le logiciel quand on créer un membre ou autre donc il appelle une fonction qui est create_guid.
Seulement le problème est que moi je fais des insert et update sur la base et du coup les ids ne sont pas toujours présent
Exemple si il y a une table membre dans les deux base ceci ne pose pas de problème car je copie aussi l'id.
Mais si dans la base cible j'ai une table mail que je n'ai pas dans la base source il n'y a pas id donc il faut que je le génère.

Citation:
d'autre part, si vous avez réellement des nombre de 36 chiffres, vous allez avoir un dépassement de capacités, même avec un bigint !
oui mais si je commence a 1 avant qui l'utilise les 36 position il faudra un moment ?

Citation:
Quand vous dites que vous ne pouvez pas le changer, ne pouvez vous pas non plus ajouter un colonne INT (ou BIGINT) qui pourrait servir de clef primaire ? ce serait nettement mieux !
Non car le logiciel qui se sert de cette base (sugarCRM) utilise la colonne id.
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 11h36   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Comment voulez-vous incrémenter un littéral ???? Cela n'a pas de sens !
La base ayant été mal modélisée, le seul remède est de bien la modéliser.
En informatique il n'y a pas de miracle :
garbage in, garbage out comme disent les ricains.... QUi peut se traduire par :
si t'as de la merde en entrée, tu auras de la merde en sortie !

Commencez donc par modéliser correctement votre base.
De plus un VARCHAR c'est contre performant pour une clef, et en sus 36 de longueur c'est plus que stupide, sauf si vous avez décidé de tuer sciemment les performances !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 11h36   #5
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Bonjour,

Citation:
create_guid
Cela semble plutôt être une valeur de type uniqueidentifier, qui peut effectivement être transtypée en char(36).
Chui pas prêt de recommander SugarCRM ...

Citation:
Mais si dans la base cible j'ai une table mail que je n'ai pas dans la base source il n'y a pas id donc il faut que je le génère.
Ben il suffit de le copier aussi

Comme on n'est pas avec une valeur entière, et qu'il me semble que le type est uniqueidentifier, vous pouvez générer des valeurs avec les fonctions NEWID() et NEWSEQUENTIALID(), la seconde étant à peine un peu mieux pour les clés primaires.

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/05/2011, 12h20   #6
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Citation:
Comment voulez-vous incrémenter un littéral ???? Cela n'a pas de sens !
Je n'en sais strictement rien c'est pour ça que je cherche une solution.

Citation:
Commencez donc par modéliser correctement votre base.
De plus un VARCHAR c'est contre performant pour une clef, et en sus 36 de longueur c'est plus que stupide, sauf si vous avez décidé de tuer sciemment les performances !
Oui mais ça c'est pas a moi qui faut le dire il y a le site de sugarcrmpour ça.
Moi ce que je sais, c'est que à défaut d'avoir de la "merde en sortie" j'ai une NOTE à la sortie.

Expliquer moi comment je peux changer la base sans toucher au logiciel ???


Citation:
Comme on n'est pas avec une valeur entière, et qu'il me semble que le type est uniqueidentifier, vous pouvez générer des valeurs avec les fonctions NEWID() et NEWSEQUENTIALID(), la seconde étant à peine un peu mieux pour les clés primaires.
merci je vais voir.
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 13h40   #7
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Donc, la réponse à votre question primale est NON.
Et si vous devez avoir une note, c'est 20 sur 20, si vous me répondez non !

A partir du moment ou la question est absurde, aucune solution n'est possible !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 31/05/2011, 14h03   #8
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
J'ai demandais une solution j'ai pas poser de question.

Citation:
Et si vous devez avoir une note, c'est 20 sur 20, si vous me répondez non !
Si sa fonctionne pas sa m’étonnerais que on me mette un 20/20

Citation:
A partir du moment ou la question est absurde, aucune solution n'est possible !
Vous voulez dire qu'il y a aucun moyen pour faire ce que je veux ?
Qu'il y a aucun algorithme qui peut me générer une clé unique ?

Vous avez pas répondue à ma question.

Citation:
Expliquer moi comment je peux changer la base sans toucher au logiciel ???
A+
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 14h15   #9
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Elsuket vous a donné la solution, ou plutôt UNE solution...

SugarCRM propose aussi des API, et expose surement sa fonction de génération de clef...

mais d'après ce que dit la doc de sugarCRM :
Citation:
You can also import data from a previous system with one primary key format and then have all new records in Sugar use the GUID primary key format. All keys simply need to be stored as unique strings with no more than 36 characters.
je pense que NEWID fera bien l'affaire. Cela tombe bien pour vous, il génère des chaines de... 36 caractères

Code SQL :
1
2
3
4
 
INSERT INTO MaBaseCible..MaTableCible (ColonnePK, AutresColonnes)
SELECT NEWID(), AutresColonnes
FROM MaBaseSource..MaTableSource
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 31/05/2011, 14h30   #10
Futur Membre du Club
 
Inscription : juin 2006
Messages : 217
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 217
Points : 16
Points : 16
Oui merci cela marche très bien.
france38 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2011, 17h48   #11
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Citation:
Envoyé par aieeeuuuuu
je pense que NEWID fera bien l'affaire. Cela tombe bien pour vous, il génère des chaines de... 36 caractères
Désolé de chipoter, mais NEWID() génère une valeur de type uniqueidentifier (qui occupe 16 octets).

Il est possible de transtyper cette valeur de type uniqueidentifier en char(36) ... mais à ce moment là, la valeur de type char(36) occupe ... 36 octets (1 octet par caractère en ASCII ) :

Citation:
Envoyé par elsuket
Cela semble plutôt être une valeur de type uniqueidentifier, qui peut effectivement être transtypée en char(36).
Bonjour le boulot pour les jointures ...

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h35.


 
 
 
 
Partenaires

Hébergement Web