Bonjour,

Je rencontre un soucis de syntaxe avec du SQL dynamique afin de faire passer en paramètre de ma procédure stockée le nom partiel de ma table.

J'ai utilisé la syntaxe présentée ici.

Ma procédure initiale sans SQL dynamique :

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
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
 
ALTER PROCEDURE [dbo].[TEST_PS_Insert_Cas_Annulation] 
 
@id_bon_peinture int,
@id_cas_annulation int,
@precision_refus_peinture text	
 
AS
BEGIN
	SET NOCOUNT ON;
 
        INSERT INTO DEV_REL_ANNULATION
	(
	id_bon_peinture,
	id_cas_annulation,
	precision_refus_peinture
	)
	Values
	(@id_bon_peinture,
	@id_cas_annulation,
	@precision_refus_peinture
	)
END
Cette Procédure Stockée fonctionne correctement.


Première version avec du SQL dynamique :

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
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
 
ALTER PROCEDURE [dbo].[TEST_PS_Insert_Cas_Annulation] 
 
@nom_serveur varchar(10),
@id_bon_peinture int,
@id_cas_annulation int,
@precision_refus_peinture text	
 
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	DECLARE @Ma_Requete varchar (8000)
 
 
    -- Insert statements for procedure here
 
	SET @Ma_Requete = 
	'INSERT INTO '+@nom_serveur+'_REL_ANNULATION
	(
	id_bon_peinture,
	id_cas_annulation,
	precision_refus_peinture
	)
	Values
	(@id_bon_peinture,
	@id_cas_annulation,
	@precision_refus_peinture
	)'
 
	EXEC (@Ma_Requete)
 
END
Je n'ai pas d'erreur de syntaxe. Cependant lorsque j'exécute dans le requêteur Microsoft SQL Serveur Management Studio Express j'obtient le message d'erreur suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
Msg 137, Niveau 15, État 2, Ligne 8
La variable scalaire "@id_bon_peinture" doit être déclarée.
 
(1 ligne(s) affectée(s))
J'ai donc pensé à cette deuxième solution en concaténant les variables d'entrées :

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
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
 
ALTER PROCEDURE [dbo].[TEST_PS_Insert_Cas_Annulation] 
 
@nom_serveur varchar(10),
@id_bon_peinture int,
@id_cas_annulation int,
@precision_refus_peinture text	
 
AS
BEGIN
 
	SET NOCOUNT ON;
	DECLARE @Ma_Requete varchar (8000)
 
	SET @Ma_Requete = 
	'INSERT INTO '+@nom_serveur+'_REL_ANNULATION
	(
	id_bon_peinture,
	id_cas_annulation,
	precision_refus_peinture
	)
	Values
	('+@id_bon_peinture+','+
	@id_cas_annulation+','+
	@precision_refus_peinture+'
	)'
 
	EXEC (@Ma_Requete)
 
END
Mais avec cette syntaxe il me lève cette erreur lorsque j'essaye d'enregistrer les modifications sur ma procedure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Msg*206, Niveau*16, État*2, Procédure*TEST_PS_Insert_Cas_Annulation, Ligne*24
Conflit de types d'opérandes*: text est incompatible avec int
J'avoue ne pas comprendre ou se situe le conflit d'opérande pour ce test.

Si qqn à une idée sur la syntaxe des paramètre d'entrée dans du SQL dynamique.

Merci d'avance.

Je continue à chercher d'où cela peut bien venir ....

+++