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 :

Recuperer le resultat d'une requete dans une variable


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 311
    Points : 127
    Points
    127
    Par défaut Recuperer le resultat d'une requete dans une variable
    Bonjour,

    J'essai dans la requete ci-dessous de recuperer la valeur maximum d'un identifiant (idVille) afin de pouvoir inserer une nouvelle ville avec un ID incrémenté de +1.

    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
    BEGIN TRANSACTION insertion_ville
    	DECLARE @id INT
    	DECLARE @error INT
                 DECLARE @libelleVille VARCHAR(50)
     
    	SET @error = 0
                 SET @libelleVille = 'Lyon'
     
    	SELECT INTO @id MAX(idVille) FROM dbo.Ville --le pb est dans cette ligne
     
    	IF @id = NULL
    		SET @id = 0
    	ELSE 
    		SET @id = @id +1
     
    	INSERT INTO dbo.Ville VALUES (@id,@libelleVille)
    	SET @error = @error + @@error
     
    	IF @id = NULL OR @error <> 0
    		ROLLBACK TRANSACTION insertion_ville
    	ELSE
    		COMMIT TRANSACTION insertion_ville
    Et j'obtient l'erreur suivante :
    Msg*156, Niveau*15, État*1, Ligne*7
    Syntaxe incorrecte vers le mot clé 'INTO'.
    Ou est mon erreur ? La syntaxe est-elle bonne ?

    Merci

  2. #2
    FMJ
    FMJ est déconnecté
    Membre averti
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    416
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 416
    Points : 363
    Points
    363
    Par défaut
    Salut

    Alors si je ne gourre pas, la syntaxe pour affecter la valeur d'une requête à une variable est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @id=MAX(idVille) FROM dbo.Ville
    Donc sans INTO et avec un "="

    De plus, pourquoi tu ne fais pas simplement cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO dbo.Ville 
    SELECT TOP 1 ISNULL((SELECT MAX(idVille) FROM dbo.Ville),0) + 1 AS ID, @libelleVille FROM dbo.Ville
    Comme ça, pas besoin de variable.

  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 : 43
    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 2005 ou 2008, vous pouvez gérer le cas d'exception à l'aide du contrôle TRY ... CATCH

    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
    BEGIN TRY
    	BEGIN TRANSACTION insertion_ville
     
    		INSERT INTO dbo.Ville
    		(
    			colonnes
    		)
    		SELECT CASE ISNULL(MAX(idVille), 0)
    					WHEN 0 THEN 0
    					ELSE ISNULL(MAX(idVille), 0) + 1
    				END,
    				'Lyon'
    		FROM dbo.Ville --le pb est dans cette ligne
    END TRY
    BEGIN CATCH
    	ROLLBACK TRANSACTION
    	RAISERROR('une erreur', 16, 1)
    END CATCH
    A quoi sert de mettre TOP 1 puisque vous agrégez toute la table ?
    MAX() ne vous retournera forcément qu'une valeur

    A quoi sert également de mettre tout cela dans une transaction ?
    Il y a lieu d'utiliser une déclaration explicite de transaction lorsque qu'on souhaite voir s'exécuter au moins deux instructions de modifications de données (INSERT, UPDATE ou DELETE) comme une seule.
    Donc pas dans votre cas, où vous ne faites qu'un seul INSERT
    Les instructions de modification de données sous SQL Server sont par défaut automatiquement transactionnées

    Il aurait tout de même été bien plus simple de créer votre table dbo.Ville avec une valeur de clé primaire auto-incrémentée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE dbo.TbVille
    (
    	IDVille SMALLINT IDENTITY NOT NULL CONSTRAINT PK_TbVille PRIMARY KEY,
    	nomVille VARCHAR(32) NOT NULL CONSTRAINT UQ_TbVille_nomVille UNIQUE
    )
    Vous n'avez ensuite plus qu'à écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BEGIN TRY
    	INSERT INTO dbo.TbVille (nomVille) VALUES ('LYON')
    END TRY
    BEGIN CATCH
    	RAISERROR('une erreur', 16, 1)
    END CATCH
    Et en interrogeant le table TbVilles (SELECT * FROM dbo.TbVilles), vous auriez :

    IDVille nomVille
    1 LYON
    Si par la suite nous exécutons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BEGIN TRY
    	INSERT INTO dbo.TbVille (nomVille) VALUES ('TOULOUSE')
    END TRY
    BEGIN CATCH
    	RAISERROR('une erreur', 16, 1)
    END CATCH
    Et que nous réinterrogeons la table TbVilles :

    IDVille nomVille
    1 LYON
    2 TOULOUSE
    @++

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 311
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par FMJ Voir le message
    Salut

    Alors si je ne gourre pas, la syntaxe pour affecter la valeur d'une requête à une variable est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT @id=MAX(idVille) FROM dbo.Ville
    Donc sans INTO et avec un "="

    De plus, pourquoi tu ne fais pas simplement cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO dbo.Ville 
    SELECT TOP 1 ISNULL((SELECT MAX(idVille) FROM dbo.Ville),0) + 1 AS ID, @libelleVille FROM dbo.Ville
    Comme ça, pas besoin de variable.
    Merci pour ton poste FMJ ! ta solution est correcte .

    sinon j'ai trouver aussi ==> SET @id = (SELECT MAX(idVille) FROM dbo.Ville)

    tout simplement

    elsuket, Merci a toit aussi pour ces précisions . Je vais faire plus ample recherche sur l'autoincrément

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

Discussions similaires

  1. [MySQL] requete dans une table avec une varible d'une autre table
    Par kogoi dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 03/11/2011, 15h24
  2. [MySQL] une requete dans une requete
    Par ots2 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 31/08/2011, 09h49
  3. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  4. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  5. Utilisation d'une requete dans une requete update
    Par hellbilly dans le forum Access
    Réponses: 4
    Dernier message: 09/01/2005, 15h09

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