IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

[SQL Server 2005] From int to String


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 42
    Points
    42
    Par défaut [SQL Server 2005] From int to String
    Bonjour,

    Je viens ici chercher un peu d'aide.

    Voilà dans une table j'ai un champ num_client de type int.
    J'ai un autre champ ref_client de type nvarchar(4).

    Je souhaiterais par exemple pour le client 1 avoir:
    num_client=1
    ref_client=0001

    Je souhaiterais par exemple pour le client 256 avoir:
    num_client=256
    ref_client=0256

    ...

    Comment puis-je faire?
    J'ai essayé avec Convert et Cast,mais visiblement ce n'est pas approprié.

    Je vous remercie par avance,

    Vincent

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    D'accord pour le résultat à obtenir mais quel est votre situation de départ ?
    Seul la colonne num_client est renseignée et à partir de celle-ci vous souhaitez renseigner ref_client qui est en varchar2 ?

    Quelle commande avez-vous essayé pour le CAST ?
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 42
    Points
    42
    Par défaut
    Tout d'abord,merci pour cette réponse si rapide!

    Le champ num_client est en auto-incremente.
    Je fais donc une insertion puis pour le champ ref_client.
    Ensuite je récupère la valeur de ref_client avec @@identity.
    Et je fais un update pour cette occurence pour mettre à jour le champ ref_client.

    Pour Cast,j'ai essayé divers commandes,mais aucune ne s'est avéree concluante.

    Vincent

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par Prodige2020
    Pour Cast,j'ai essayé divers commandes,mais aucune ne s'est avéree concluante
    Justement ce sont les commandes que vous avez essayées que je voulais voir (je ne connais pas SQL Server) ; essayez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE MaTable
    SET REF_CLIENT = CAST(NUM_CLIENT AS VARCHAR)
    WHERE ...
    Attention :
    - d'après votre exemple il faut aussi utiliser des caractères de bourrage avec une fonction telle que LPAD si elle est disponible sous SQL Server
    - l'utilisation de CAST est "sensible" car par exemple sous Oracle, elle fonctionne mais il convient de spécifier la longueur du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    10g SOC5> select *
      2  from dvp;
     
    NUM_CLIENT REF_
    ---------- ----
           123
     
    1 ligne sélectionnée.
     
    10g SOC5> update dvp
      2  set ref_client = cast(num_client as varchar2(4));
     
    1 ligne mise à jour.
     
    10g SOC5> select *
      2  from dvp;
     
    NUM_CLIENT REF_
    ---------- ----
           123 123
     
    1 ligne sélectionnée.
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 42
    Points
    42
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE MaTable
    SET REF_CLIENT = CAST(NUM_CLIENT AS VARCHAR)
    WHERE ...
    Voici ce que j'ai fait pour le CAST:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE prospectSET ref_prospect=CAST(@num_prospect AS nvarchar(4))
    C'est pour la conversion que j'ai fais divers essais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    10g SOC5> SELECT *
      2  FROM dvp;
     
    NUM_CLIENT REF_
    ---------- ----
           123
     
    1 ligne sélectionnée.
     
    10g SOC5> UPDATE dvp
      2  SET ref_client = cast(num_client AS varchar2(4));
     
    1 ligne mise à jour.
     
    10g SOC5> SELECT *
      2  FROM dvp;
     
    NUM_CLIENT REF_
    ---------- ----
           123 123
     
    1 ligne sélectionnée.
    Concernant cet exemple,ce n'est pas exactement ce que je veux faire.
    Par exemple j'aurais voulu que la ref du client 123 soit 0123.

    Je pense que je vais le faire à la main.
    Je pensais qu'il existait une fonction pour celà.

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Citation Envoyé par Prodige2020
    Concernant cet exemple,ce n'est pas exactement ce que je veux faire.
    Par exemple j'aurais voulu que la ref du client 123 soit 0123
    C'est justement ce que je vous disais : sous Oracle, LPAD et ça m'étonnerait que SQL Server ne dispose de cette fonction ou d'autre équivalente (cf la doc j'imagine).
    Pour le CAST, je déplacerai votre demande dans le forum SQL Server quand vous me ferez signe.
    Modérateur des forums Oracle et Langage SQL
    Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 65
    Points : 42
    Points
    42
    Par défaut
    Bon finalement je l'ai fait "à la main".

    Voici le code si ça peut aider quelq'un un jour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    -- Récupération du numéro du dernier prospect inséré
    	Set @num_prospect = @@IDENTITY
    	Set @ref=CAST(@num_prospect AS nvarchar(10))
     
    	-- Création de la référence du client
    	Set @i=4
    	Set @ref_prospect=''
     
    	WHILE @i>LEN(@ref)
    		begin
    			set @ref_prospect=@ref_prospect+'0'
    			Set @i=@i-1
    		end
     
    	set @ref_prospect=@ref_prospect+@ref
     
    	-- Enregistrement de la référence du prospect
    	UPDATE prospect	SET ref_prospect=@ref_prospect WHERE num_prospect=@num_prospect
    Et donc par exemple si je saisis un client,que le N° qui lui est attribué est le 12, la reference client(ref_client) construite sera 0012.

  8. #8
    Candidat au Club
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1
    Points : 4
    Points
    4
    Par défaut
    Exemple plus clean...

    Si vous voulez limiter l'affichage à 4 caractères:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT RIGHT('0000' + CAST(456 as varchar(4)), 4)
    on obtient 0456

    Dans mon cas particulier, je dois toujours garder les 4 premiers caractères même si la valeur dépasse 9999

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT SUBSTRING(CAST((13456 + 10000) as varchar(20)),LEN(CAST((13456+ 10000) as varchar(20)))-3,4)
    on obtient 3456

  9. #9
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Euh... LPAD et RPAD n'existent pas sous SQL Server ?
    On ne jouit bien que de ce qu’on partage.

  10. #10
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Ah non, en effet.
    Ben le plus simple, à mon avis, c'est de commencer par écrire des fonctions RPAD et LPAD :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    create function lpad(@str varchar(4000), @len int, @char char(1))
    returns varchar(4000)
    as
    begin
      declare @nbchar as int;
     
      if len(@str) >= @len
      begin
        set @nbchar = 0;
      end;
      else
      begin
        set @nbchar = @len - len(@str);
      end;
     
      return left(replace(space(@nbchar), ' ', @char) + @str, @len);
    end;
     
    create function rpad(@str varchar(4000), @len int, @char char(1))
    returns varchar(4000)
    as
    begin
      declare @nbchar as int;
     
      if len(@str) >= @len
      begin
        set @nbchar = 0;
      end;
      else
      begin
        set @nbchar = @len - len(@str);
      end;
     
      return right(@str + replace(space(@nbchar), ' ', @char), @len);
    end;
    Et ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update matable set ref = lpad(cast id as varchar(10), 5, '0');
    On ne jouit bien que de ce qu’on partage.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/10/2011, 17h36
  2. insert into sql server 2005 select from XLSX
    Par enstein8 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 24/10/2011, 12h52
  3. [SQL Server 2005] équivalent like '%' pour int
    Par Zobbiwan dans le forum Langage SQL
    Réponses: 4
    Dernier message: 01/10/2008, 15h27
  4. Réponses: 1
    Dernier message: 04/03/2007, 15h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo