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 :

Comment ne pas utiliser une #table


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Comment ne pas utiliser une #table
    Bonjour,

    Pour faire une jointure sur une table avec l'OUTPUT d'un UPDATE, je suis obligé d'utiliser par une #table:

    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
     
    ALTER PROCEDURE maProc
    	@monParam1 INT = 50
    	@monParam2 TINYINT
    AS
    BEGIN
    	DECLARE @SQL VARCHAR(1200)
     
    	SET @SQL = '
    		CREATE TABLE #maTable_tempo
    		(
    			maListeDeColonnes
    		)
     
    	UPDATE TOP (' + CONVERT(VARCHAR(10), @monParam1) + ') maTable1
    	SET maColonne1 = 1
    	OUTPUT INSERTED.* INTO #maTable_tempo
    	WHERE maColonne2 = 0
    	AND maColonne3 = ' + CONVERT(VARCHAR(10), @monParam2) +
    	' AND SENDDATETIME < GETDATE()
     
    	SELECT *, CURRENCY + CONVERT(VARCHAR(10), CONVERT(INT, PRICE)) TARIFF
    	FROM #maTable_tempo
    	JOIN dbo.maTable2 (nolock) ON maTable2.maColonneDeJointure = #maTable_tempo.maColonneDeJointure
    	ORDER BY autreColonne1, autreColonne2 DESC
     
    	DROP TABLE #maTable_tempo'
    	EXEC (@SQL);
    END
    Car si j'écris :

    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
    ALTER PROCEDURE maProc
    	@monParam1 INT = 50
    	@monParam2 TINYINT
    AS
    BEGIN
    	DECLARE @SQL VARCHAR(1100)
    	
    	SET @SQL = '
    		DECLARE @maTable_tempo TABLE
    		(
    			maListeDeColonnes
    		);	 
    
    	UPDATE TOP (' + CONVERT(VARCHAR(10), @monParam1) + ') maTable1
    	SET maColonne1 = 1
    	OUTPUT INSERTED.* INTO @maTable_tempo
    	WHERE maColonne2 = 0
    	AND maColonne3 = ' + CONVERT(VARCHAR(10), @monParam2) +
    	' AND SENDDATETIME < GETDATE()
    
    	SELECT *, CURRENCY + CONVERT(VARCHAR(10), CONVERT(INT, PRICE)) TARIFF
    	FROM @maTable_tempo
    	JOIN dbo.maTable2 (nolock) ON maTable2.maColonneDeJointure = @maTable_tempo.maColonneDeJointure
    	ORDER BY autreColonne1, autreColonne2 DESC'
    	
    	EXEC (@SQL);
    END
    j'ai une erreur qui me dit que la variable @maTable_tempo doit être déclarée.

    Mon problème avec la #maTable_tempo, c'est que si maProc est appelée plusieurs fois, ça va planter puisque l'objet #maTable_tempo sera déjà existant.
    Je pense être obligé d'utiliser une table temporaire puisque je dois faire un ORDER BY sur l'OUTPUT de mon UPDATE. Je suis également obligé de faire ma jointure pour récupérer les colonnes CURRENCY et PRICE.

    Y'a-t-il un solution ?

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1 240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 1 240
    Par défaut
    et c'est quoi le problème? tu as une table temporaire et tu la droppes ensuite ca marche bien ton truc.

  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
    Exact, sauf si la procéduré stockée est appelée plusieurs fois en même temps : dans ce cas là #maTable_tempo existe déjà

  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 : 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
    En fait c'est moi qui ai des lubies : les #tables sont locales à la procédure qui les requiert

    Ce que je ne comprends pas c'est pourquoi on ne peut pas faire de jointure avec des @table ...

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

Discussions similaires

  1. [AC-2003] Comment utiliser une table access pour 2 fichiers différents ?
    Par bigounet dans le forum Access
    Réponses: 2
    Dernier message: 08/04/2012, 22h45
  2. Comment utiliser une table temporaire ?
    Par tibofo dans le forum Développement
    Réponses: 4
    Dernier message: 04/03/2009, 19h36
  3. Réponses: 12
    Dernier message: 09/05/2008, 08h32
  4. [MFC] Comment créer et utiliser une base Access
    Par maitre hibou dans le forum MFC
    Réponses: 3
    Dernier message: 10/05/2004, 18h11
  5. Comment ne pas rejouer une animation après un clic ?
    Par mmmmhhh dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 04/09/2002, 16h11

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