Bonjour

avec un ensemble de 5 bases identiques
je voudrais généralisée la procedure stockée de copie suivante
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
 
CREATE PROCEDURE [dbo].[Usp_Dev_Devpart_Copy] 
	@ID_TO_COPY INT,
	@ID_DEST INT,
	@MODE char(2),
	-- FA = Fils ainé
	-- FC = Fils cadet
	-- GF = Grand Frère
	-- PF = Petit frère
	@NEW_DPT_ID INT OUTPUT
AS
BEGIN
 
	DECLARE
		@ERROR INT,
		@ROWCOUNT INT,
		@TRANCOUNT INT,
		@NBE INT,
		@DEV_ID_SRC INT,
		@DPT_PID_SRC INT,
		@DPT_ORD_SRC INT,
		@DPS_ID_SRC INT,
 
		@DEV_ID_DEST INT,
		@DPT_PID_DEST INT,
		@DPT_ORD_DEST INT,
 
		@DPT_FAMILLE_DEST dbo.D_FAMILLE_ARTICLE,
		@DPT_SFAMILLE_DEST dbo.D_FAMILLE_ARTICLE,
		@DPS_ID_DEST INT,
 
		@NEW_ORD INT,
		@NEW_PID INT;
 
	SELECT @DEV_ID_SRC = DEV_ID, @DPT_PID_SRC = DPT_PID, @DPT_PID_SRC = DPT_ORD FROM dbo.T_DEVPART_DPT
	WHERE DPT_ID = @ID_TO_COPY
 
	SELECT @DEV_ID_DEST = DEV_ID, @DPT_PID_DEST = DPT_PID, @DPT_ORD_DEST = DPT_ORD FROM dbo.T_DEVPART_DPT
	WHERE DPT_ID = @ID_DEST
 
	SET @ERROR = 0;
	SET @ROWCOUNT = 0;
	SET @TRANCOUNT = 0;
 
	-- démarrage transaction -------------------
	BEGIN TRANSACTION;
	SET @TRANCOUNT = 1;
 
	IF @MODE = 'FA'
	BEGIN
		UPDATE dbo.T_DEVPART_DPT
		SET DPT_ORD = DPT_ORD + 1
		WHERE DPT_PID = @ID_DEST;
		SELECT @ERROR = @@ERROR, @ROWCOUNT = @@ROWCOUNT;
		IF @ERROR <> 0 GOTO LBL_ERROR;
 
		SET @NEW_PID = @ID_DEST;
		SET @NEW_ORD = 1;
	END
	IF @MODE = 'FC'
	BEGIN
		SELECT @NBE = COUNT(*) FROM dbo.T_DEVPART_DPT
		WHERE DPT_PID = @ID_DEST;
 
		SET @NEW_PID = @ID_DEST
		SET @NEW_ORD = @NBE + 1
	END
	ELSE IF @MODE = 'GF'
	BEGIN
		UPDATE dbo.T_DEVPART_DPT
		SET DPT_ORD = DPT_ORD + 1
		WHERE DPT_PID = @DPT_PID_DEST AND DPT_ORD >= @DPT_ORD_DEST;
		SELECT @ERROR = @@ERROR, @ROWCOUNT = @@ROWCOUNT;
		IF @ERROR <> 0 GOTO LBL_ERROR;
 
		SET @NEW_PID = @DPT_PID_DEST;
		SET @NEW_ORD = @DPT_ORD_DEST;
 
	END
	ELSE IF @MODE = 'PF'
	BEGIN
		UPDATE dbo.T_DEVPART_DPT
		SET DPT_ORD = DPT_ORD + 1
		WHERE DPT_PID = @DPT_PID_DEST AND DPT_ORD > @DPT_ORD_DEST;
		SELECT @ERROR = @@ERROR, @ROWCOUNT = @@ROWCOUNT;
		IF @ERROR <> 0 GOTO LBL_ERROR;
 
		SET @NEW_PID = @DPT_PID_DEST;
		SET @NEW_ORD = @DPT_ORD_DEST + 1;
	END
 
	INSERT INTO dbo.T_DEVPART_DPT
		(
       DEV_ID,
       DPT_PID,
       DPT_ORD,
       DPS_ID,
       DPT_FAMILLE,
       DPT_SFAMILLE,
       DPT_REF,
       DPT_LIBELLE,
       DPT_QTE,
       UPU_CODE,
       DPT_PUA1,
       DPT_MT_AJUST,
       DPT_TEXTCOM,
	   DPT_PRN
		)
	SELECT
       @DEV_ID_DEST,
       @NEW_PID,
       @NEW_ORD,
       DPS_ID,
       DPT_FAMILLE,
       DPT_SFAMILLE,
       DPT_REF,
       DPT_LIBELLE,
       DPT_QTE,
       UPU_CODE,
       DPT_PUA1,
       DPT_MT_AJUST,
       DPT_TEXTCOM,
	   DPT_PRN
	FROM   dbo.T_DEVPART_DPT
	WHERE DPT_ID = @ID_TO_COPY;
 
	SET @NEW_DPT_ID = SCOPE_IDENTITY();
 
	SELECT @ERROR = @@ERROR, @ROWCOUNT = @@ROWCOUNT;
	IF @ERROR <> 0 OR @ROWCOUNT = 0 GOTO LBL_ERROR;
 
	SELECT
	@DPT_FAMILLE_DEST = DPT_FAMILLE,
	@DPT_SFAMILLE_DEST = DPT_SFAMILLE,
	@DPS_ID_DEST = DPS_ID
	FROM dbo.T_DEVPART_DPT
	WHERE DPT_ID = @NEW_DPT_ID
 
 
	IF @DPS_ID_DEST = 4
	BEGIN
		SELECT @NBE = COUNT(*) FROM dbo.T_DEV_CALC_DEC
		WHERE (DEV_ID = @DEV_ID_DEST) AND
		(DEC_FAMILLE = @DPT_FAMILLE_DEST) AND (ISNULL(DEC_SFAMILLE, '+-*') = ISNULL(@DPT_SFAMILLE_DEST,'+-*'));
 
		IF ISNULL(@NBE,0) = 0
		BEGIN
			INSERT INTO dbo.T_DEV_CALC_DEC (DEV_ID, DEC_FAMILLE, DEC_SFAMILLE)
			VALUES (@DEV_ID_DEST , @DPT_FAMILLE_DEST, @DPT_SFAMILLE_DEST);
 
			SELECT @ERROR = @@ERROR, @ROWCOUNT = @@ROWCOUNT;
			IF @ERROR <> 0 OR @ROWCOUNT = 0 GOTO LBL_ERROR;
		END
	END;
 
	UPDATE dbo.T_DEVIS_DEV SET DEV_ISCALC = 0
	WHERE DEV_ID = @DEV_ID_DEST;
 
	COMMIT TRANSACTION;
	RETURN (0) 
 
	LBL_ERROR:
	IF @@TRANCOUNT > 1
		COMMIT TRANSACTION
	IF @TRANCOUNT > 0
		ROLLBACK TRANSACTION
	IF @ROWCOUNT >= 1
		ROLLBACK TRANSACTION
	RETURN (-1)
 
 
END
afin d'être en mesure de copier depuis n'importe quelle base vers la base courante sans dupliquer le code
je pensais utiliser les synonymes mais cela semble poser un problème

la procedure crée un synonyme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
CREATE SYNONYM SourceSyn FOR [Base1].[dbo].[T_DEVPART_DPT];
et l'utilise en table source dans la procedure

seulement je ne voit pas comment une autre session peut faire pointer ce synonym vers par exemple base2
sans le détruire et le recréer ce qui va forcément poser problème
Y a t-il une autre méthode ?