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

MS SQL Server Discussion :

Procédure d'une table qui fait appel à une autre table


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Points : 528
    Points
    528
    Par défaut Procédure d'une table qui fait appel à une autre table
    Bonjour,

    J'ai à ma disposition deux tables sql que sont :

    Application :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE Application
    [idApplication] [int] IDENTITY (1,1) NULL,
    [idStatut] [int] NULL
    ...
    ...
    Et MAJ (mises à jour):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE MAJ
    [idMAJ] [int] IDENTITY (1,1) NULL,
    [UserId] [int],
    [DateMAJ] [smalldatetime] NOT NULL CONSTRAINT [DF_MAJ_DateMAJ] DEFAULT (getdate()),
    [idApplication] [int]
    J'aimerais pouvoir, à l'aide des dates de mise à jour présentes dans la table MAJ, créer un nouveau champ "DerniereVersion" dans la table Application qui prend pour valeur la derniere date de mise à jour de l'application donnée.

    Or, dans une procédure stockée pour SetApplication par exemple (procédure appelée pour une mise à jour des champs de l'application en prenant en compte la date dateMAJ), j'ai du mal à voir comment on effectue des manipulations d'une autre table, à savoir ici, la table MAJ pour prendre la date la plus récente de mise à jour...

    Si vous avez des idées, n'hésitez pas

    Merci !

  2. #2
    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,

    Quelle est votre version de SQL Server ?
    Quel est le code de votre procédure stockée ?

    Vous pouvez faire cela de deux façons, pour réaliser la mise à jour de façon automatique :

    - si votre procédure stockée peut récupérer ou calcule la date de dernière version, le tour est joué
    - avec un trigger FOR/AFTER INSERT/UPDATE.

    Pour ajouter la colonne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE dbo.Application
    ADD DerniereVersion smalldatetime
    GO
    Et pour la mettre à jour, sous SQL Server 2000 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE		dbo.Application
    SET		DerniereVersion = C.last_DateMAJ
    FROM		dbo.Application AS A
    INNER JOIN	(
    			SELECT	idApplication
    				, MAX(DateMAJ) AS last_DateMAJ
    			FROM	dbo.MAJ
    		) AS C ON A.idApplication = C.idApplication
    Et dès SQL Server 2005 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ;WITH
    	CTE AS
    	(
    		SELECT	idApplication
    			, MAX(DateMAJ) AS last_DateMAJ
    		FROM	dbo.MAJ
    	)
    UPDATE		dbo.Application
    SET		DerniereVersion = C.last_DateMAJ
    FROM		dbo.Application AS A
    INNER JOIN	CTE AS C ON A.idApplication = C.idApplication
    Si vous souhaitez utiliser le trigger :

    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
    ALTER TABLE dbo.Application
    ADD DerniereVersion smalldatetime
    GO
     
    CREATE TRIGGER TR_A_IU_MAJ
    	ON dbo.MAJ
    AFTER INSERT, UPDATE
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	UPDATE		dbo.Application
    	SET		DerniereVersion = I.DerniereVersion
    	FROM		dbo.Application AS A
    	INNER JOIN	INSERTED AS I ON A.idApplication = I.idApplication
    END
    Pour la procédure stockée, sans le code, c'est du temps perdu.

    @++

  3. #3
    Membre confirmé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Points : 528
    Points
    528
    Par défaut
    Merci pour ta réponse elsuket ! et désolé de n'avoir été assez précis.

    J'utilise SQL 2005 et ma procédure ressemble à ça :

    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
    ALTER PROCEDURE SetApplication
    (
    @idApplication int = null,
    @idStatut int,
    ...
    ...
    )
     
    IF EXISTS (SELECT * FROM Application WHERE idApplication = @idApplication)
    BEGIN
    UPDATE Application
    SET
    idStatut = @idStatut,
    ...
    WHERE idApplication = @idApplication
    END
    ELSE IF NOT EXISTS(SELECT * FROM Application WHERE idApplication = @idApplication)
    BEGIN
    INSERT INTO(
    idStatut,
    ...
    )
    VALUES(
    @idStatut,
    ...
    )
    END
     
    ELSE
    RETURN -1
    Donc en gros je vais devoir utiliser ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ;WITH
    	CTE AS
    	(
    		SELECT	idApplication
    			, MAX(DateMAJ) AS last_DateMAJ
    		FROM	dbo.MAJ
    	)
    UPDATE		dbo.Application
    SET		DerniereVersion = C.last_DateMAJ
    FROM		dbo.Application AS A
    INNER JOIN	CTE AS C ON A.idApplication = C.idApplication
    Par contre je ne comprends pas la syntaxe du ;WITH et le CTE AS ?
    Aussi, je ne saisie pas le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INNER JOIN	CTE AS C ON A.idApplication = C.idApplication
    Et la fonction MAX(DateMAJ) existe déjà ?

    Aussi, pour le bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT	idApplication
    			, MAX(DateMAJ) AS last_DateMAJ
    		FROM	dbo.MAJ
    il ne faut pas rajouter quelque chose pour dire que le MAX(DateMAJ) doit se faire sur les MAJ qui sont spécifiques à un idAppplication ?

    Parce qu'avant dfe faire le INNER JOIN sinon, on a dans CTE les idApplication et le Max de toutes les mises à jours donc dans la colone des max il y aura la même valeur pour tous les idApplications (cette valeur sera le max de toutes les MAJ de toutes les applications) non?

    Merci encore !

  4. #4
    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
    Donc en gros je vais devoir utiliser ceci :
    Je ne sais pas car le code de ta procédure stockée ne montre pas comment tu affectes une valeur à la colonne DateMAJ de la table Application.

    Que se passe-t-il également lorsque l'appel se fait sans valuation du paramètre @idApplication de la procédure ?

    A quoi te sert le RETURN -1 ?

    Par contre je ne comprends pas la syntaxe du ;WITH et le CTE AS ?
    Je spécifie une expression de table commune (en anglais common table expression, abrévié CTE )
    C'est en fait une vue qui n'a de durée de vie que la requête pour laquelle elle est spécifiée.

    Aussi, je ne saisie pas le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INNER JOIN	CTE AS C ON A.idApplication = C.idApplication
    Nous venons dans l'expression de table commune de rechercher la date de dernière mise à jour pour toutes les applications.
    Donc pour affecter la bonne date de dernière mise à jour aux applications, il faut utiliser une telle jointure.
    L'INNER JOIN n'est pas dissociable du FROM dbo.Application AS A

    Et la fonction MAX(DateMAJ) existe déjà ?
    La fonction MAX() oui, comme les nombreuses autres fonctions natives que tu peux trouver, dans l'Explorateur d'Objets de SQL Server Management Studio (F7) sous le nœud Programmabilité > Fonctions > Fonctions Système > Fonctions d'aggrégat.

    il ne faut pas rajouter quelque chose pour dire que le MAX(DateMAJ) doit se faire sur les MAJ qui sont spécifiques à un idAppplication ?
    Bien vu, j'ai oublié le GROUP BY :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ;WITH
    	CTE AS
    	(
    		SELECT	idApplication
    			, MAX(DateMAJ) AS last_DateMAJ
    		FROM	dbo.MAJ
    		GROUP BY idApplication
    	)
    UPDATE		dbo.Application
    SET		DerniereVersion = C.last_DateMAJ
    FROM		dbo.Application AS A
    INNER JOIN	CTE AS C ON A.idApplication = C.idApplication

  5. #5
    Membre confirmé
    Avatar de betsprite
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    472
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 472
    Points : 528
    Points
    528
    Par défaut
    Ok merci encore elsuket je vois un peu mieux !

    En fait la table MAJ est rempli a chaque clique sur un bouton de la page mais cette procédure n'appartient pas a SetApplication.

    Pour le RETURN -1, je ne peux pas vraiment te dire étant donné que je travail sur un projet qui avait déjà une structure de départ...

    Je vais essayer de rajouter le bout de code pour la dernière version !

    Merci !

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Avez-vous envisager l'emploie d'une vue ?

    Vous pourriez éviter des problèmes en cascade.
    Most Valued Pas mvp

Discussions similaires

  1. Exécuter un jar qui fait appel à d'autre jar
    Par Seb33300 dans le forum Général Java
    Réponses: 3
    Dernier message: 04/04/2012, 15h41
  2. Réponses: 0
    Dernier message: 04/08/2009, 11h30
  3. Réponses: 5
    Dernier message: 15/07/2009, 22h44
  4. Ajouter une bouton qui va appeler une macro
    Par funkykid dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 22/05/2008, 11h12
  5. Réponses: 2
    Dernier message: 06/03/2008, 21h20

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