le mieux serait que tu es un compteur dans un champ et un autre champ pour ton nom
ainsi tu pourrais faire select left(nom,3) + right('000' + cast('15' as varchar(3)),3) as tonchamp from tatable etc...
"Chris" a écrit dans le message de news:
bonjour,
voila j'ai une table CLIENT avec Id_CLient compose des 3 premières lettre du nom et un numéro ex: Mr BONJOUR : BON001, Mr BONLIT : BON002 ...
je cherche a faire un requête SQL qui prend en paramètre le nom du client et qui me renvoie les 3 première lettre et les 3 chiffres qui suivront.
par exemple si j'insère Mr BONNECHANCE j'aimerais qu'il me retourne
BON003..
je voulais passer par un curseur mais la je bloque. pourriez vous m'aiguiller
merci
tintin
Bonjour,
Je crois que Christophe a bien raison, ce n'est vraiment pas raisonnable de définir une telle clé.
Avec deux champs au lieu d'un c'est moins pire, mais tu risques de ne pas pouvoir écrire de contraintes d'intégrité référentielles.
Le mieux est donc un seul IDentifiant numérique, calculé automatiquement par SQL-Server.
Ce qu'on te demande est à mon avis une survivance due à l'absence de recherche par nom dans l'application. Si elle existait, un identifiant numérique simple serait suffisant et ce serait préférable.
Mais si tu ne peux vraiment pas faire autrement, essaie ce qui suit :
create table client ( cle char(3), nom varchar(50) );
create function dbo.NouvelIdClient() returns char(3) as begin declare @Id char(3); select @Id=substring(convert(varchar(4), coalesce(max(substring(Cle, 4, len(Cle)-3)),0)+1001),2,3) from client ; return @Id end
select dbo.NouvelIdClient() -- te donne la première clé disponible
-- tu peux insérer comme cela insert into client select substring('Salut',1,3)+dbo.NouvelIdClient(), 'Salut'
Ces instructions sont des exemples qui peuvent être utilisés de différentes manières.
Attention, ça ne marche que si tu a moins de 1000 clients et il est interdit de changer le nom d'un client. Pas très chouette comme contraintes...
004BonCourage
"Chris" a écrit :
bonjour,
voila j'ai une table CLIENT avec Id_CLient compose des 3 premières lettre du nom et un numéro ex: Mr BONJOUR : BON001, Mr BONLIT : BON002 ...
je cherche a faire un requête SQL qui prend en paramètre le nom du client et qui me renvoie les 3 première lettre et les 3 chiffres qui suivront.
par exemple si j'insère Mr BONNECHANCE j'aimerais qu'il me retourne BON003..
je voulais passer par un curseur mais la je bloque. pourriez vous m'aiguiller
merci
Bonjour,
Je crois que Christophe a bien raison, ce n'est vraiment pas raisonnable de
définir une telle clé.
Avec deux champs au lieu d'un c'est moins pire, mais tu risques de ne pas
pouvoir écrire de contraintes d'intégrité référentielles.
Le mieux est donc un seul IDentifiant numérique, calculé automatiquement par
SQL-Server.
Ce qu'on te demande est à mon avis une survivance due à l'absence de
recherche par nom dans l'application. Si elle existait, un identifiant
numérique simple serait suffisant et ce serait préférable.
Mais si tu ne peux vraiment pas faire autrement, essaie ce qui suit :
create table client ( cle char(3), nom varchar(50) );
create function dbo.NouvelIdClient() returns char(3)
as begin
declare @Id char(3);
select @Id=substring(convert(varchar(4), coalesce(max(substring(Cle, 4,
len(Cle)-3)),0)+1001),2,3) from client ;
return @Id
end
select dbo.NouvelIdClient() -- te donne la première clé disponible
-- tu peux insérer comme cela
insert into client
select substring('Salut',1,3)+dbo.NouvelIdClient(), 'Salut'
Ces instructions sont des exemples qui peuvent être utilisés de différentes
manières.
Attention, ça ne marche que si tu a moins de 1000 clients et il est interdit
de changer le nom d'un client. Pas très chouette comme contraintes...
004BonCourage
"Chris" a écrit :
bonjour,
voila j'ai une table CLIENT avec Id_CLient compose des 3 premières
lettre du nom et un numéro
ex: Mr BONJOUR : BON001, Mr BONLIT : BON002 ...
je cherche a faire un requête SQL qui prend en paramètre le nom du
client et qui me renvoie les 3 première lettre et les 3 chiffres qui
suivront.
par exemple si j'insère Mr BONNECHANCE j'aimerais qu'il me retourne BON003..
je voulais passer par un curseur mais la je bloque.
pourriez vous m'aiguiller
Je crois que Christophe a bien raison, ce n'est vraiment pas raisonnable de définir une telle clé.
Avec deux champs au lieu d'un c'est moins pire, mais tu risques de ne pas pouvoir écrire de contraintes d'intégrité référentielles.
Le mieux est donc un seul IDentifiant numérique, calculé automatiquement par SQL-Server.
Ce qu'on te demande est à mon avis une survivance due à l'absence de recherche par nom dans l'application. Si elle existait, un identifiant numérique simple serait suffisant et ce serait préférable.
Mais si tu ne peux vraiment pas faire autrement, essaie ce qui suit :
create table client ( cle char(3), nom varchar(50) );
create function dbo.NouvelIdClient() returns char(3) as begin declare @Id char(3); select @Id=substring(convert(varchar(4), coalesce(max(substring(Cle, 4, len(Cle)-3)),0)+1001),2,3) from client ; return @Id end
select dbo.NouvelIdClient() -- te donne la première clé disponible
-- tu peux insérer comme cela insert into client select substring('Salut',1,3)+dbo.NouvelIdClient(), 'Salut'
Ces instructions sont des exemples qui peuvent être utilisés de différentes manières.
Attention, ça ne marche que si tu a moins de 1000 clients et il est interdit de changer le nom d'un client. Pas très chouette comme contraintes...
004BonCourage
"Chris" a écrit :
bonjour,
voila j'ai une table CLIENT avec Id_CLient compose des 3 premières lettre du nom et un numéro ex: Mr BONJOUR : BON001, Mr BONLIT : BON002 ...
je cherche a faire un requête SQL qui prend en paramètre le nom du client et qui me renvoie les 3 première lettre et les 3 chiffres qui suivront.
par exemple si j'insère Mr BONNECHANCE j'aimerais qu'il me retourne BON003..
je voulais passer par un curseur mais la je bloque. pourriez vous m'aiguiller
merci
Chris
tintin a écrit :
Bonjour,
Je crois que Christophe a bien raison, ce n'est vraiment pas raisonnable de définir une telle clé.
Avec deux champs au lieu d'un c'est moins pire, mais tu risques de ne pas pouvoir écrire de contraintes d'intégrité référentielles.
Le mieux est donc un seul IDentifiant numérique, calculé automatiquement par SQL-Server.
Ce qu'on te demande est à mon avis une survivance due à l'absence de recherche par nom dans l'application. Si elle existait, un identifiant numérique simple serait suffisant et ce serait préférable.
Mais si tu ne peux vraiment pas faire autrement, essaie ce qui suit :
create table client ( cle char(3), nom varchar(50) );
create function dbo.NouvelIdClient() returns char(3) as begin declare @Id char(3); select @Id=substring(convert(varchar(4), coalesce(max(substring(Cle, 4, len(Cle)-3)),0)+1001),2,3) from client ; return @Id end
select dbo.NouvelIdClient() -- te donne la première clé disponible
-- tu peux insérer comme cela insert into client select substring('Salut',1,3)+dbo.NouvelIdClient(), 'Salut'
Ces instructions sont des exemples qui peuvent être utilisés de différentes manières.
Attention, ça ne marche que si tu a moins de 1000 clients et il est interdit de changer le nom d'un client. Pas très chouette comme contraintes...
004BonCourage
"Chris" a écrit :
bonjour,
voila j'ai une table CLIENT avec Id_CLient compose des 3 premières lettre du nom et un numéro ex: Mr BONJOUR : BON001, Mr BONLIT : BON002 ...
je cherche a faire un requête SQL qui prend en paramètre le nom du client et qui me renvoie les 3 première lettre et les 3 chiffres qui suivront.
par exemple si j'insère Mr BONNECHANCE j'aimerais qu'il me retourne BON003..
je voulais passer par un curseur mais la je bloque. pourriez vous m'aiguiller
merci
merci je vais tester cela :)
tintin a écrit :
Bonjour,
Je crois que Christophe a bien raison, ce n'est vraiment pas raisonnable de
définir une telle clé.
Avec deux champs au lieu d'un c'est moins pire, mais tu risques de ne pas
pouvoir écrire de contraintes d'intégrité référentielles.
Le mieux est donc un seul IDentifiant numérique, calculé automatiquement par
SQL-Server.
Ce qu'on te demande est à mon avis une survivance due à l'absence de
recherche par nom dans l'application. Si elle existait, un identifiant
numérique simple serait suffisant et ce serait préférable.
Mais si tu ne peux vraiment pas faire autrement, essaie ce qui suit :
create table client ( cle char(3), nom varchar(50) );
create function dbo.NouvelIdClient() returns char(3)
as begin
declare @Id char(3);
select @Id=substring(convert(varchar(4), coalesce(max(substring(Cle, 4,
len(Cle)-3)),0)+1001),2,3) from client ;
return @Id
end
select dbo.NouvelIdClient() -- te donne la première clé disponible
-- tu peux insérer comme cela
insert into client
select substring('Salut',1,3)+dbo.NouvelIdClient(), 'Salut'
Ces instructions sont des exemples qui peuvent être utilisés de différentes
manières.
Attention, ça ne marche que si tu a moins de 1000 clients et il est interdit
de changer le nom d'un client. Pas très chouette comme contraintes...
004BonCourage
"Chris" a écrit :
bonjour,
voila j'ai une table CLIENT avec Id_CLient compose des 3 premières
lettre du nom et un numéro
ex: Mr BONJOUR : BON001, Mr BONLIT : BON002 ...
je cherche a faire un requête SQL qui prend en paramètre le nom du
client et qui me renvoie les 3 première lettre et les 3 chiffres qui
suivront.
par exemple si j'insère Mr BONNECHANCE j'aimerais qu'il me retourne BON003..
je voulais passer par un curseur mais la je bloque.
pourriez vous m'aiguiller
Je crois que Christophe a bien raison, ce n'est vraiment pas raisonnable de définir une telle clé.
Avec deux champs au lieu d'un c'est moins pire, mais tu risques de ne pas pouvoir écrire de contraintes d'intégrité référentielles.
Le mieux est donc un seul IDentifiant numérique, calculé automatiquement par SQL-Server.
Ce qu'on te demande est à mon avis une survivance due à l'absence de recherche par nom dans l'application. Si elle existait, un identifiant numérique simple serait suffisant et ce serait préférable.
Mais si tu ne peux vraiment pas faire autrement, essaie ce qui suit :
create table client ( cle char(3), nom varchar(50) );
create function dbo.NouvelIdClient() returns char(3) as begin declare @Id char(3); select @Id=substring(convert(varchar(4), coalesce(max(substring(Cle, 4, len(Cle)-3)),0)+1001),2,3) from client ; return @Id end
select dbo.NouvelIdClient() -- te donne la première clé disponible
-- tu peux insérer comme cela insert into client select substring('Salut',1,3)+dbo.NouvelIdClient(), 'Salut'
Ces instructions sont des exemples qui peuvent être utilisés de différentes manières.
Attention, ça ne marche que si tu a moins de 1000 clients et il est interdit de changer le nom d'un client. Pas très chouette comme contraintes...
004BonCourage
"Chris" a écrit :
bonjour,
voila j'ai une table CLIENT avec Id_CLient compose des 3 premières lettre du nom et un numéro ex: Mr BONJOUR : BON001, Mr BONLIT : BON002 ...
je cherche a faire un requête SQL qui prend en paramètre le nom du client et qui me renvoie les 3 première lettre et les 3 chiffres qui suivront.
par exemple si j'insère Mr BONNECHANCE j'aimerais qu'il me retourne BON003..
je voulais passer par un curseur mais la je bloque. pourriez vous m'aiguiller
merci
merci je vais tester cela :)
SQLpro [MVP]
C'est effectivement particulièrement mauvais comme implémentation et conduit généralement à des désastres au niveau performances comme au niveau logiquee (que faire si plus de 1000 clients nommée MAR (MARTIN) ? )
mais voici une telle requête (paramétrée), avec les tables qui vont bien :
INSERT INTO T_CLIENT_CLI VALUES ('MARTIN', 'MAR001') INSERT INTO T_CLIENT_CLI VALUES ('MARTIN', 'MAR002') INSERT INTO T_CLIENT_CLI VALUES ('DUPONT', 'DUP001')
-- exemple avec BUGEAUD..
DECLARE @NOM VARCHAR(16)
SET @NOM = 'BUGEAUD'
SELECT CLI_REF + CASE WHEN LEN(CLI_NUM) = 1 THEN '00' + CLI_NUM WHEN LEN(CLI_NUM) = 2 THEN '0' + CLI_NUM ELSE CLI_NUM END FROM ( SELECT SUBSTRING(@NOM, 1, 3) AS CLI_REF, CAST(MAX(CAST(SUBSTRING(CLI_REF, 4, 3) AS INTEGER)) + 1 AS VARCHAR(3)) AS CLI_NUM FROM T_CLIENT_CLI WHERE SUBSTRING(CLI_REF, 1, 3) = SUBSTRING(@NOM, 1, 3) GROUP BY SUBSTRING(CLI_REF, 1, 3) UNION SELECT DISTINCT SUBSTRING(@NOM, 1, 3), '1' FROM INFORMATION_SCHEMA.TABLES WHERE NOT EXISTS (SELECT * FROM T_CLIENT_CLI WHERE SUBSTRING(CLI_REF, 1, 3) = SUBSTRING(@NOM, 1, 3)) AND TABLE_NAME = 'T_CLIENT_CLI' AND TABLE_SCHEMA = 'dbo' ) T
Essayez ensuite avec MARTINOT par exemple.
Bon amusement !
A +
Chris a écrit :
bonjour,
voila j'ai une table CLIENT avec Id_CLient compose des 3 premières lettre du nom et un numéro ex: Mr BONJOUR : BON001, Mr BONLIT : BON002 ...
je cherche a faire un requête SQL qui prend en paramètre le nom du client et qui me renvoie les 3 première lettre et les 3 chiffres qui suivront.
par exemple si j'insère Mr BONNECHANCE j'aimerais qu'il me retourne BON003..
je voulais passer par un curseur mais la je bloque. pourriez vous m'aiguiller
merci
-- Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com Audit, conseil, expertise, formation, modélisation, tuning, optimisation ********************* http://www.datasapiens.com ***********************
C'est effectivement particulièrement mauvais comme implémentation et
conduit généralement à des désastres au niveau performances comme au
niveau logiquee (que faire si plus de 1000 clients nommée MAR (MARTIN) ? )
mais voici une telle requête (paramétrée), avec les tables qui vont bien :
INSERT INTO T_CLIENT_CLI VALUES ('MARTIN', 'MAR001')
INSERT INTO T_CLIENT_CLI VALUES ('MARTIN', 'MAR002')
INSERT INTO T_CLIENT_CLI VALUES ('DUPONT', 'DUP001')
-- exemple avec BUGEAUD..
DECLARE @NOM VARCHAR(16)
SET @NOM = 'BUGEAUD'
SELECT CLI_REF +
CASE
WHEN LEN(CLI_NUM) = 1 THEN '00' + CLI_NUM
WHEN LEN(CLI_NUM) = 2 THEN '0' + CLI_NUM
ELSE CLI_NUM
END
FROM
(
SELECT SUBSTRING(@NOM, 1, 3) AS CLI_REF,
CAST(MAX(CAST(SUBSTRING(CLI_REF, 4, 3) AS INTEGER)) + 1 AS VARCHAR(3))
AS CLI_NUM
FROM T_CLIENT_CLI
WHERE SUBSTRING(CLI_REF, 1, 3) = SUBSTRING(@NOM, 1, 3)
GROUP BY SUBSTRING(CLI_REF, 1, 3)
UNION
SELECT DISTINCT SUBSTRING(@NOM, 1, 3), '1'
FROM INFORMATION_SCHEMA.TABLES
WHERE NOT EXISTS (SELECT * FROM T_CLIENT_CLI WHERE SUBSTRING(CLI_REF,
1, 3) = SUBSTRING(@NOM, 1, 3))
AND TABLE_NAME = 'T_CLIENT_CLI'
AND TABLE_SCHEMA = 'dbo'
) T
Essayez ensuite avec MARTINOT par exemple.
Bon amusement !
A +
Chris a écrit :
bonjour,
voila j'ai une table CLIENT avec Id_CLient compose des 3 premières
lettre du nom et un numéro
ex: Mr BONJOUR : BON001, Mr BONLIT : BON002 ...
je cherche a faire un requête SQL qui prend en paramètre le nom du
client et qui me renvoie les 3 première lettre et les 3 chiffres qui
suivront.
par exemple si j'insère Mr BONNECHANCE j'aimerais qu'il me retourne
BON003..
je voulais passer par un curseur mais la je bloque.
pourriez vous m'aiguiller
merci
--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
C'est effectivement particulièrement mauvais comme implémentation et conduit généralement à des désastres au niveau performances comme au niveau logiquee (que faire si plus de 1000 clients nommée MAR (MARTIN) ? )
mais voici une telle requête (paramétrée), avec les tables qui vont bien :
INSERT INTO T_CLIENT_CLI VALUES ('MARTIN', 'MAR001') INSERT INTO T_CLIENT_CLI VALUES ('MARTIN', 'MAR002') INSERT INTO T_CLIENT_CLI VALUES ('DUPONT', 'DUP001')
-- exemple avec BUGEAUD..
DECLARE @NOM VARCHAR(16)
SET @NOM = 'BUGEAUD'
SELECT CLI_REF + CASE WHEN LEN(CLI_NUM) = 1 THEN '00' + CLI_NUM WHEN LEN(CLI_NUM) = 2 THEN '0' + CLI_NUM ELSE CLI_NUM END FROM ( SELECT SUBSTRING(@NOM, 1, 3) AS CLI_REF, CAST(MAX(CAST(SUBSTRING(CLI_REF, 4, 3) AS INTEGER)) + 1 AS VARCHAR(3)) AS CLI_NUM FROM T_CLIENT_CLI WHERE SUBSTRING(CLI_REF, 1, 3) = SUBSTRING(@NOM, 1, 3) GROUP BY SUBSTRING(CLI_REF, 1, 3) UNION SELECT DISTINCT SUBSTRING(@NOM, 1, 3), '1' FROM INFORMATION_SCHEMA.TABLES WHERE NOT EXISTS (SELECT * FROM T_CLIENT_CLI WHERE SUBSTRING(CLI_REF, 1, 3) = SUBSTRING(@NOM, 1, 3)) AND TABLE_NAME = 'T_CLIENT_CLI' AND TABLE_SCHEMA = 'dbo' ) T
Essayez ensuite avec MARTINOT par exemple.
Bon amusement !
A +
Chris a écrit :
bonjour,
voila j'ai une table CLIENT avec Id_CLient compose des 3 premières lettre du nom et un numéro ex: Mr BONJOUR : BON001, Mr BONLIT : BON002 ...
je cherche a faire un requête SQL qui prend en paramètre le nom du client et qui me renvoie les 3 première lettre et les 3 chiffres qui suivront.
par exemple si j'insère Mr BONNECHANCE j'aimerais qu'il me retourne BON003..
je voulais passer par un curseur mais la je bloque. pourriez vous m'aiguiller
merci
-- Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com Audit, conseil, expertise, formation, modélisation, tuning, optimisation ********************* http://www.datasapiens.com ***********************