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 :

[Script SQL] Faire des conditions


Sujet :

Développement SQL Server

  1. #1
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut [Script SQL] Faire des conditions
    Bonjour,


    J'ai fait une procédure stockée qui met à jour 2 tables, elle fonctionne tres bien.
    J'ai par contre pas pensé à une chose.

    Voila en gros ma requete toute simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
     
    UPDATE Portal_maTable
    SET 
    Title=@Title,
    WHERE 
    ContactId = @ContactId
    AND 
    LangId = @LangId;
     
    ...
    Mais en fait ce que je voudrais faire c'est de vérifier qu'il existe déja une ligne répondant au condition de mon WHERE et si ce n'est pas le cas créer la ligne donc faire un INSERT.

    Quelqu'un pourrait il me dire comment créer une condition dans ma procédure.

    je pensais faire quelque chose comment cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    select * from matable
    WHERE
     ContactId = @ContactId
    AND 
    LangId = @LangId;
     
     
    SI (la requete retourne quelquechose) ALORS
    ----- je fais le update
    SINON
    ------ je fais le INSERT

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par Gregory.M Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select * from matable
    WHERE
     ContactId = @ContactId
    AND 
    LangId = @LangId;
     
     
    SI (la requete retourne quelquechose) ALORS
    ----- je fais le update
    SINON
    ------ je fais le INSERT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    IF EXISTS(SELECT * FROM matable WHERE condition)
    BEGIN
    -- alors UPDATE
    END ELSE BEGIN
    -- sinon INSERT
    END

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Si vous êtes sous SQL Server 2008, pensez à l'ordre MERGE.

    @++

  4. #4
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    j'utilise sql server 2005

  5. #5
    Membre émérite
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 756
    Points : 2 990
    Points
    2 990
    Par défaut
    As-tu essayé la proposition de cmako ?
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be

  6. #6
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Merde je ne l'avais meme pas vu!!!

  7. #7
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Bonjour,

    J'essaie d'appliquer ce que vous m'avez dit dans les messages précédents mais lorsque j'execute ce code j'ai une erreur...

    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
     
    IF EXISTS(Select * from sysobjects where name LIKE 'Portal_UpdateLanguageVisibility' AND Xtype='P')
    BEGIN
    	set ANSI_NULLS ON
    	set QUOTED_IDENTIFIER ON
    	go
    	ALTER Procedure [dbo].[Portal_UpdateLanguageVisibility]
    	(
    		@Visible  bit,
    		@LangID int
    	)
    	AS
     
    	UPDATE Portal_Languages
    	SET Visible = @Visible
    	WHERE Langid = @LangID;
     
    END
    Erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Msg 102, Level 15, State 1, Line 4
    Syntaxe incorrecte vers 'ON'.
    Msg 102, Level 15, State 1, Procedure Portal_UpdateLanguageVisibility, Line 12
    Syntaxe incorrecte vers 'END'.

    Par contre cela marche quand j'enleve BEGIN et END, mais quand j'ajoute un else ca ne marche plus...

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par Gregory.M Voir le message
    Bonjour,

    J'essaie d'appliquer ce que vous m'avez dit dans les messages précédents mais lorsque j'execute ce code j'ai une erreur...

    Par contre cela marche quand j'enleve BEGIN et END, mais quand j'ajoute un else ca ne marche plus...
    IL ne faut jamais mettre GO à l'intérieur d'une procédure

    Ensuite, on ne met JAMAIS un ALTER PROCEDURE après un BEGIN

    Les commandes CREATE PROCEDURE et ALTER PROCEDURE doivent doivent être toujours au début ou après la commande GO

  9. #9
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    Citation Envoyé par cmako Voir le message
    IL ne faut jamais mettre GO à l'intérieur d'une procédure
    Ah oui? pourtant qu'on fait create procédure il y a déjà plusieurs GO.

    En fait la je ne fais plus une procédure stockée, je fais un script qui regarde si la procédure existe et si elle existe je la met à jour sinon je la créé


    Si j'enleve le go j'ai les erreurs suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Msg 156, Level 15, State 1, Line 6
    Syntaxe incorrecte vers le mot clé 'Procedure'.
    Msg 137, Level 15, State 2, Line 14
    La variable scalaire "@Visible" doit être déclarée.

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par Gregory.M Voir le message
    Ah oui? pourtant qu'on fait create procédure il y a déjà plusieurs GO.

    En fait la je ne fais plus une procédure stockée, je fais un script qui regarde si la procédure existe et si elle existe je la met à jour sinon je la créé
    NON, on peut faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE PROCEDURE toto
    AS 
    BEGIN 
    ...
    END
    GO
     
    CREATE PROCEDURE titi
    AS 
    BEGIN 
    ...
    END
    GO

  11. #11
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    J'ai fait ca sur le modèle qui tu viens de faire. Mais ca ne marche pas non plus

    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
     
    IF EXISTS(Select * from sysobjects where name LIKE 'Portal_UpdateLanguageVisibility' AND Xtype='P')
    BEGIN
    	ALTER Procedure [dbo].[Portal_UpdateLanguageVisibility]
    	(
    		@Visible  bit,
    		@LangID int
    	)
    	AS
    	BEGIN
    		UPDATE Portal_Languages
    		SET Visible = @Visible
    		WHERE Langid = @LangID;
    	END
    GO
    END
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    Msg 156, Level 15, State 1, Line 3
    Syntaxe incorrecte vers le mot clé 'Procedure'.
    Msg 137, Level 15, State 2, Line 11
    La variable scalaire "@Visible" doit être déclarée.
    Msg 102, Level 15, State 1, Line 1
    Syntaxe incorrecte vers 'END'.

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Si tu veux modifier une procédure il faut faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'Portal_UpdateLanguageVisibility'))
    	DROP Portal_UpdateLanguageVisibility
    GO
     
    CREATE PROCEDURE Portal_UpdateLanguageVisibility(@Visible  bit, @LangID int)
    AS
    ...
    GO

  13. #13
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par Gregory.M Voir le message
    J'ai fait ca sur le modèle qui tu viens de faire. Mais ca ne marche pas non plus

    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
     
    IF EXISTS(Select * from sysobjects where name LIKE 'Portal_UpdateLanguageVisibility' AND Xtype='P')
    BEGIN
    	ALTER Procedure [dbo].[Portal_UpdateLanguageVisibility]
    	(
    		@Visible  bit,
    		@LangID int
    	)
    	AS
    	BEGIN
    		UPDATE Portal_Languages
    		SET Visible = @Visible
    		WHERE Langid = @LangID;
    	END
    GO
    END
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    Msg 156, Level 15, State 1, Line 3
    Syntaxe incorrecte vers le mot clé 'Procedure'.
    Msg 137, Level 15, State 2, Line 11
    La variable scalaire "@Visible" doit être déclarée.
    Msg 102, Level 15, State 1, Line 1
    Syntaxe incorrecte vers 'END'.
    Normal, CREATE PROCEDURE doit être au tout début
    et GO doit être tout à la fin

  14. #14
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    J'y suis presque sauf qu'il y a un probleme sur le drop de la procedure stockée

    j'ai essayé avec un ';' ou 'dbo' devant le nom de la procédure ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'Portal_UpdateLanguageVisibility'))
    	drop Portal_UpdateLanguageVisibility
     
    CREATE Procedure [dbo].[Portal_UpdateLanguageVisibility]
    (
        @Visible  bit,
    	@LangID int
    )
    AS
     
    UPDATE Portal_Languages
    SET Visible = @Visible
    WHERE Langid = @LangID;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Msg 102, Level 15, State 1, Line 2
    Syntaxe incorrecte vers 'Portal_UpdateLanguageVisibility'.

  15. #15
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    T'as pas mis le GO devant le CREATE PROCEDURE

  16. #16
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    GO n'est pas une instruction T-SQL, mais une commande qui était destinée au départ à l'utilitaire en ligne de commandes OSQL, puis à SQLCMD.
    Elle est reconnue par SQL Server Management Studio.

    Ces 3 outils interprètent GO comme le signal qu'ils doivent soumettre le lot T-SQL au moteur de base de données.

    Le lot "en cours" se compose de toutes les instructions :

    - comprises entre la dernière commande GO et la suivante ou entre le dernier GO et la fin d'un script
    - depuis le début de la session

    Dans le dernier bout de code de Gregory.M, il n'y a pas de GO entre l'instruction DROP PROCEDURE et CREATE PROCEDURE, donc le lot est transmis tel quel à l'instance, ce qui explique la remarque de cmako.

    @++

  17. #17
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    J'ai toujour la meme erreur!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'Portal_UpdateLanguageVisibility'))
    	drop Portal_UpdateLanguageVisibility
    
    GO
    CREATE Procedure [dbo].[Portal_UpdateLanguageVisibility] (@Visible  bit,@LangID int)
    AS
    GO
    UPDATE Portal_Languages
    SET Visible = @Visible
    WHERE Langid = @LangID

  18. #18
    Membre averti Avatar de Gregory.M
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    684
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 684
    Points : 309
    Points
    309
    Par défaut
    ah voila j'ai trouvé. il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    drop proc Portal_UpdateLanguageVisibility

  19. #19
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    616
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Luxembourg

    Informations forums :
    Inscription : Mars 2007
    Messages : 616
    Points : 556
    Points
    556
    Par défaut
    Citation Envoyé par Gregory.M Voir le message
    ah voila j'ai trouvé. il faut faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    drop proc Portal_UpdateLanguageVisibility
    Enlève le GO après AS

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

Discussions similaires

  1. [SQL] - Faire une condition si un champ n'est pas nul
    Par toxycyty dans le forum Débuter
    Réponses: 2
    Dernier message: 19/06/2008, 10h42
  2. Script pour faire des rapports
    Par fourniey dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 16/05/2008, 15h29
  3. Faire des conditions avec un Dbcombobox
    Par b.bilel dans le forum Bases de données
    Réponses: 3
    Dernier message: 12/02/2008, 17h59
  4. faire des conditions sur les champs
    Par biba158 dans le forum JDBC
    Réponses: 9
    Dernier message: 25/06/2007, 13h38
  5. Script SQL avec des EXIT SQL.SQLCODE
    Par fidififouille dans le forum Oracle
    Réponses: 14
    Dernier message: 23/04/2004, 16h45

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