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 :

[2005] Problème de syntax ?


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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
    Par défaut [2005] Problème de syntax ?
    Bonjour,

    Je n'arrive pas à comprendre en quoi un trigger que j'ai écrit est mal rédigé.
    En effet, lorsque que j'essaie d'exécuter le query de création, j'ai cette erreur qui se manifeste :
    Msg 4104, Level 16, State 1, Procedure tMembers_AFUPDATE, Line 25
    The multi-part identifier "I.Id" could not be bound.
    Msg 4104, Level 16, State 1, Procedure tMembers_AFUPDATE, Line 25
    The multi-part identifier "D.FederalNumber" could not be bound.
    Voici mon code :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    IF  EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[tMembers_AFUPDATE]'))
    DROP TRIGGER [dbo].[tMembers_AFUPDATE]
    GO
    
    CREATE TRIGGER tMembers_AFUPDATE
       ON  tMembers
       AFTER UPDATE
    AS 
    BEGIN
    	/*
    	A member with no FederalNumber is a member know of Mygolf only.
    	So we're sure we have to send a synchro message when the federal number is set with an UPDATE.
    
    	Members from other system than mygolf, will be created (INSERT) with a federalnumber.
    	*/
    
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
    	DECLARE @SynchroMembers TABLE
    	(
    		IdMember BIGINT
    		, IdClub INT
    		, Federated BIT
    	);
    
    	WITH concernedClubs
    	(
    		IdClub
    	)
    	AS
    	(
    		SELECT
    			C.Id
    		FROM tClubs AS C
    		WHERE C.IsMygolf = 1
    		AND C.Federal = 1
    	)
    
    	INSERT @SynchroMembers
    	(
    		IdMember
    		, IdClub
    		, Federated
    	)
    	SELECT
    		I.Id
    		, C.IdClub
    		, CASE WHEN D.FederalNumber = '' THEN 0 ELSE 1 END AS Federated
    	FROM inserted AS I
    	INNER JOIN deleted AS D ON (
    		D.Id = I.Id
    	)
    	CROSS JOIN (
    		/*
    		Retrieve the MyGolf Home Club for any operation (which are supposed to come from the Home Club).
    		Or any MyGolf Club for a federal number attribution.
    		*/
    		SELECT CM.IdClub
    		FROM tClubMembers AS CM
    		INNER JOIN concernedClubs AS C ON (
    			C.IdClub = CM.IdClub
    		)
    		WHERE CM.IdMember = I.Id
    		AND (
    			IsHomeclub = 1
    			OR
    			D.FederalNumber = ''
    		)
    	) AS C
    	WHERE I.FederalNumber <> ''
    
    [...]
    Ce qui est très curieux, c'est que si je retire la CTE, aucune erreur n'est présentée.
    Je suis plus que perplexe.

    Pouvez-vous m'aider ?

    Merci.

  2. #2
    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
    Par défaut
    J'ai trouvé une syntax qui fonctionne.

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    DECLARE @SynchroMembers TABLE
    	(
    		IdMember BIGINT
    		, IdClub INT
    		, Federated BIT
    	);
     
    	WITH concernedClubs
    	(
    		IdClub
    	)
    	AS
    	(
    		SELECT
    			C.Id
    		FROM tClubs AS C
    		WHERE C.IsMygolf = 1
    		AND C.Federal = 1
    	)
     
    	INSERT @SynchroMembers
    	(
    		IdMember
    		, IdClub
    		, Federated
    	)
    	SELECT
    		I.Id
    		, CM.IdClub
    		, CASE WHEN D.FederalNumber = '' THEN 0 ELSE 1 END AS Federated
    	FROM inserted AS I
    	INNER JOIN deleted AS D ON (
    		D.Id = I.Id
    	)
    	INNER JOIN tClubMembers AS CM ON (
    		/*
    		Retrieve the MyGolf Home Club for any operation (which are supposed to come from the Home Club).
    		Or any MyGolf Club for a federal number attribution.
    		*/
    		CM.IdMember = I.Id
    		AND
    		(
    			IsHomeclub = 1
    			OR
    			D.FederalNumber = ''
    		)
    		AND
    		EXISTS (
    			SELECT TOP(1) 1
    			FROM concernedClubs AS C
    			WHERE C.IdClub = CM.IdClub
    		)
    	)
    	WHERE I.FederalNumber <> ''
    Faut croire, qu'on ne peut pas faire de sous select liée aux tables jointes à l'extérieur du CROSS JOIN.
    Dommage...

  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 : 44
    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
    Par défaut
    Bonjour,

    Quel est l'intérêt d'utiliser une expression de table commune pour peupler une variable de type table ?

    @++

  4. #4
    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
    Par défaut
    Alléger l'écriture, en isolant un concept, en limitant l'indention, en évitant la réecriture si la table était accédée par plusieurs jointures de portées distinctes.

Discussions similaires

  1. Problème de syntaxe - elements['x'].value
    Par Equus dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/02/2005, 11h22
  2. [Interbase] Problème de syntaxe SQL
    Par navis84 dans le forum InterBase
    Réponses: 4
    Dernier message: 22/12/2004, 17h07
  3. Problème de syntaxe
    Par Mister_FX dans le forum ASP
    Réponses: 5
    Dernier message: 30/06/2004, 10h01
  4. Problème de syntaxe ADO ...
    Par bendev dans le forum ASP
    Réponses: 2
    Dernier message: 15/04/2004, 14h38
  5. Réponses: 2
    Dernier message: 08/03/2004, 15h10

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