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 ?