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 :

[PROC] utiliser des données selectionnées dans une procédure.


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 37
    Points : 71
    Points
    71
    Par défaut [PROC] utiliser des données selectionnées dans une procédure.
    Bonjour,

    Je souhaiterais affecter des valeurs dans @v_ind_code, @v_pay_code, @v_indnat_principale mais je ne vois pas comment m'y prendre.
    En oracle j'aurais fait SELECT INTO unevariableRECORD et je l'aurais exploitée, mais sur sql server, je n'ai pas trouvé d'équivalent.

    Pourriez-vous eclairer ma lanterne?

    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
    CREATE PROCEDURE [dbo].[web_nationalite] 
    (
    	@id_ind		int,
    	@id_pays	int
    )
    AS
     
    BEGIN
    SET NOCOUNT ON;
    DECLARE	@v_ind_code		int
    DECLARE	@v_pay_code		int
    DECLARE	@v_indnat_principale	bit
     
     
    	IF( SELECT @v_ind_code = i.ind_code, @v_pay_code =  i.pay_code, i.indnat_date, i.indnat_date_fin, @v_indnat_principale = i.indnat_principale
    	FROM individu_nationalite AS i
    	WHERE i.ind_code = @id_ind AND i.indnat_principale = 1 )
     
    		IF(@v_pay_code <> @id_pays)
    			UPDATE individu_nationalite SET indnat_date_fin = CURRENT_TIMESTAMP, indnat_principale = 0
    			WHERE individu_nationalite.ind_code = @id_ind
    			INSERT INTO individu_nationalite (ind_code, pay_code, indnat_date, indnat_date_fin, indnat_principale)
    			VALUES(@id_ind, @id_pays, CURRENT_TIMESTAMP, NULL, 1)
    	ELSE
    		INSERT INTO individu_nationalite (ind_code, pay_code, indnat_date, indnat_date_fin, indnat_principale)
    		VALUES(@id_ind, @id_pays, CURRENT_TIMESTAMP, NULL, 1)
    END
    Merci d'avance

    Axel Masset

    EDIT: J'ai trouvé une piste, les CURSOR, je vais approfondir ça.

  2. #2
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut Pas de curseur si possible
    Bonsoir,

    Evitez les curseurs si possible, c'est très lent (dans un rapport mini de 1 à 50) par rapport à un traitement ensembliste.

    J'ai du mal à lire votre code, est ce ceci que vous voulez faire ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    UPDATE individu_nationalite 
    SET indnat_date_fin = CURRENT_TIMESTAMP, indnat_principale = 0
    WHERE 
    	individu_nationalite.ind_code = @id_ind 
    AND
    	pay_code = @id_pays 
    AND 
    	indnat_principale = 1
     
    INSERT INTO individu_nationalite (ind_code, pay_code, indnat_date, indnat_date_fin, indnat_principale)
    SELECT @id_ind, @id_pays, CURRENT_TIMESTAMP, NULL, 1
    @+

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 37
    Points : 71
    Points
    71
    Par défaut
    Bonjour,

    Désolé de ne pas avoir répondu plus tôt.
    Voici le code que j'obtiens avec les CURSOR
    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
    37
    38
    39
    40
     
    CREATE PROCEDURE [dbo].[web_nationalite] 
    (
    	@id_ind		int,
    	@id_pays	int
    )
    AS
     
    BEGIN
    SET NOCOUNT ON;
    DECLARE @v_ind_code int
    DECLARE @v_pay_code int
    DECLARE @v_indnat_principale bit
    DECLARE	nat_cursor CURSOR FOR
    		SELECT i.ind_code, i.pay_code, i.indnat_principale
    		FROM individu_nationalite AS i
    		WHERE i.ind_code = @id_ind AND i.indnat_principale = 1
    	OPEN nat_cursor
        FETCH FROM nat_cursor INTO @v_ind_code, @v_pay_code, @v_indnat_principale
     
     
    	IF @@FETCH_STATUS = 0
    	BEGIN	
    		IF @v_pay_code <> @id_pays
    		BEGIN
    			UPDATE individu_nationalite SET indnat_date_fin = CURRENT_TIMESTAMP, indnat_principale = 0
    			WHERE individu_nationalite.ind_code = @id_ind
    			INSERT INTO individu_nationalite (ind_code, pay_code, indnat_date, indnat_date_fin, indnat_principale)
    			VALUES(@id_ind, @id_pays, CURRENT_TIMESTAMP, NULL, 1)
    		END
    	END
    	ELSE
    	BEGIN
    		INSERT INTO individu_nationalite (ind_code, pay_code, indnat_date, indnat_date_fin, indnat_principale)
    		VALUES(@id_ind, @id_pays, CURRENT_TIMESTAMP, NULL, 1)
    	END
    END
    CLOSE nat_cursor
    DEALLOCATE nat_cursor
    GO
    En fait je veux ajouté une nationalité à un individu.
    Si elle existe déja et que celle en paramètre est égale, je ne chnage rien.
    Si elle existe mais est différente de celle existante, je désactive l'ancienne et crée une nouvelle.
    Si elle n'existe pas je la crée.

    Ce code est fonctionnel mais si avez plus optimisé, je suis preneur.

    Merci de votre réponse

    Axel Masset

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 858
    Points : 52 996
    Points
    52 996
    Billets dans le blog
    6
    Par défaut
    Si vous utilisez SQL Server 2008, utilisez directement l'ordre SQL MERGE qui permet de combiner un INSERT ou un UPDATE suivant critère.
    Cela fait partie de la norme SQL.

    A +

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2009
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 37
    Points : 71
    Points
    71
    Par défaut
    Je suis toujours sous SQLServer 2005.
    Merci pour cette info, je ne connaissais pas, je vais quand même allez voir cette fonctionnalité sur msdn.

  6. #6
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut Si MERGE n'est pas disponible
    Bonjour,

    Si vous n'êtes pas sous 2008, plutôt que le curseur, vous pouvez essayer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    --Crée la nouvelle nationalité principale si elle n'existe pas.
    INSERT INTO individu_nationalite (ind_code, pay_code, indnat_date, indnat_date_fin, indnat_principale)
    SELECT @id_ind, @id_pays, CURRENT_TIMESTAMP, NULL, 1
    FROM individu_nationalite WHERE i.indnat_principale = 1 and ind_code = @id_ind and pay_code <> @id_pays
     
    --Désactivation de l'ancienne si elle existe.
    UPDATE individu_nationalite SET indnat_date_fin = CURRENT_TIMESTAMP, indnat_principale = 0
    WHERE i.indnat_principale = 1 and ind_code = @id_ind and pay_code <> @id_pays
    Si ça fonctionne, utilisez une transaction car vous allez avoir deux identités principales au milieu de la transaction

    @+

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

Discussions similaires

  1. Utilisation Des Données Contenues Dans Une Liste
    Par Sniffle dans le forum Général Python
    Réponses: 6
    Dernier message: 10/03/2009, 16h41
  2. Réponses: 1
    Dernier message: 12/12/2007, 10h35
  3. Utilisation des fichiers CSS dans une application Struts
    Par menzlitsh dans le forum Struts 1
    Réponses: 4
    Dernier message: 22/09/2006, 16h29
  4. Insérer des données Excel dans une table ACCESS
    Par anikeh dans le forum Access
    Réponses: 4
    Dernier message: 21/12/2005, 22h42
  5. Insérer des données Excel dans une base Access ?
    Par MaTHieU_ dans le forum Access
    Réponses: 3
    Dernier message: 22/06/2005, 15h11

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