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

Développement SQL Server Discussion :

Parser un VARCHAR et incrémenter une table @variable


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2014
    Messages : 80
    Par défaut Parser un VARCHAR et incrémenter une table @variable
    Bonjour à tous,

    N'étant pas spécialisé en Transact SQl, je viens vers vous pour un conseil d'implémentation.
    Je dois avouer que j'ai principalement un souci de syntaxe :/

    Dans le cadre d'une procédure stockée, je reçois un VARCHAR(128) composé de plusieurs numéro de client.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    @clientNumber		  VARCHAR(128) = '02214, 25368, 0452, 178954'
    Le but de ma démarche est de pouvoir parser le VARCHAR, de stocker les numéros de client dans un table variable et d'utiliser par la suite chaque numéro de client dans une requête.
    J'ai donc déclaré ma table variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DECLARE @clientNumberTable TABLE (
    			client varchar(10));
    Et la maintenant je galère à trouver la syntaxe me permettant de récupérer chaque élément pour les injecter par la suite dans ma requête
    Requête du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT Name, Address FROM  dbo.ClientTable CT INNER JOIN dbo.ClientAddress  CA
    					ON CA.idAddress  =  CT.idClient
    					WHERE CT.idClient like '@clientNumberTable.client'
    J'ai essayé plusieurs syntaxes, en supprimant les espaces, en prenant la virgule comme délimiteur...
    Aucun résultat satisfaisant

    Et pourtant j'ai l'impression qu'il n'y a rien de compliqué.

    Bref un petit coup de main, juste pour populer la table variable n'est pas de refus.

    Merci beaucoup par avance pour vos coups de main et vos avis.
    Bon week-end à tous

  2. #2
    Invité
    Invité(e)
    Par défaut
    Tiens, voici de l'inspiration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    -- parse d'une chaine de caractères avec séparateur
    DECLARE @t TABLE ( texte VARCHAR(50) );
    INSERT @t VALUES ('toto;titi;tutu;tata');
    ; WITH CTE AS ( SELECT CAST('<c>' + REPLACE(texte, ';','</c><c>') + '</c>' AS XML) AS texte_xml FROM @t )
    	SELECT T.C.value('(./text())[1]','VARCHAR(10)') AS C FROM CTE CROSS APPLY texte_xml.nodes('//c') AS T(C)

  3. #3
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2014
    Messages : 80
    Par défaut
    Merci beaucoup 7gyY9w1ZY6ySRgPeaefZ !
    J'ai essayé mais sans grand résultat : (
    J'ai la vague impession que CROSS APPLY n'est accessible qu'à partir de 2016.
    En tout bonne idée pour la CTE 👍


    A moins que je confonde avec STRING_SPLIT :/

  4. #4
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    C'est disponible en 2008, mais cela dépend du niveau de compatibilité de la base. Si ta base est en compatibilité 80, ça ne fonctionnera pas.

    Que donne ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT name, compatibility_level
    FROM sys.databases
    WHERE database_id = DB_ID()

  5. #5
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2014
    Messages : 80
    Par défaut
    Bonjour rudib et merci pour ton soutien

    le resutl de ta requête est
    Name : maBaseClient
    Compatibility_ level : 100


    Ça m'agace un peu, j'ai essayé plusieurs solutions trouvées à droite, à gauche, sans arriver au résultat souhaité
    Pourtant ça me parait simple.

    J'ai une table temporaire.
    Je souhaite juste parser un VARCHAR pour incrémenter la table temporaire, par exemple

    client
    ---------
    012562
    8549
    326582
    01782

    et ensuite avec un bon vieux foreach :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT name, adress FROM maTable WHERE idClient = @clientNumberTable.client

    Ce qui m'agace c'est qu'en Java je sais le faire ....

  6. #6
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2014
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2014
    Messages : 80
    Par défaut
    Bonjour à tous

    J'ai donc créé une fonction SPLIT
    (https://www.aspsnippets.com/Articles...-and-2012.aspx)

    Du coup, par un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT @clientNumberTable SELECT LTRIM(Items) As Items FROM dbo.FSSplitString (@clientNumber, ',');
    Maintenant il me suffit de faire une boucle 'je pense', pour chaque ligne de la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM dbo.maBaseClient WHERE id = @clientNumberTable.Items
    Je crois savoir que les curseurs sont dépréciés...
    Du coup, un WHILE ?

    Je dis pas non à un conseil sur la performance
    et la fonctionnalité.

    Merci par avance, bonne semaine à tous

Discussions similaires

  1. Incrémenter une macro variable?
    Par jkiii dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/02/2014, 11h37
  2. [AC-2010] Ajouter lignes à une table variable
    Par John38290 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 15/10/2013, 15h51
  3. incrémenter une table via un formulaire
    Par entrepDBH dans le forum IHM
    Réponses: 7
    Dernier message: 11/03/2011, 12h27
  4. Réponses: 4
    Dernier message: 14/12/2009, 12h53
  5. Compter le nombre de vide dans une table / variable
    Par diombo dans le forum VBA Access
    Réponses: 4
    Dernier message: 13/05/2009, 00h32

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