Bonjour,

J'ai réalisé un script de duplication de base de données sur une base SQL Express 10.50.4042 (2008 R2 SP2). Il fonctionne lorsque je n'utilise pas de variables. Par contre, quand j'utilise des variables, Management Studio m'indique que certaines procédures stockées, que je ne connais pas, sont introuvables. Voici le script :

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
/* on se positionne dans la base master */ 
Exec('USE master;')
 
/* Définition des variables */
DECLARE @date_du_jour				nvarchar;
DECLARE @nom_base_production		sysname;
DECLARE @nom_base_test				sysname;
DECLARE @nom_base_sauvegarde_test	sysname;
DECLARE @emplacement_sauvegarde		sysname;
DECLARE @emplacement_fic_donnees	sysname;
DECLARE @bBaseTestExiste			bit;
DECLARE @sql						nvarchar
 
/* Initialisation des variables */
SET @date_du_jour				= REPLACE(LEFT(CONVERT(varchar, getDate(),126),15),'T','_');
SET @nom_base_production		= 'ERPALEX';
SET @nom_base_test				= 'ERPALEXTEST';
SET @nom_base_sauvegarde_test	= 'ERPALEXTEST_' +  @date_du_jour
SET @emplacement_sauvegarde		= 'C:\Poubelle\'
SET @emplacement_fic_donnees	= 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA\' 
SET @bBaseTestExiste			= 0;
 
/* Si la base de données de test existe déjà */
SET @bBaseTestExiste = (SELECT COUNT(*) FROM sys.databases WHERE sys.databases.name = @nom_base_test);
IF @bBaseTestExiste > 0
BEGIN
 
	/* ************************************************************************** */
	/* Sauvegarde de la base de données de test avec contrôle d'intégrité		*/
	/* ************************************************************************* */
	SET @sql = 'BACKUP DATABASE ' + @nom_base_test +
				'	TO DISK = ''' + @emplacement_sauvegarde + @date_du_jour + '_BACKUP_'+@nom_base_test + '.BAK''' +
				'	WITH FORMAT, CHECKSUM, COPY_ONLY;'
	EXEC(@sql)
 
	/* ************************************************************************* */
	/* Restauration de la base de test dans la base de sauvegarde de la base test					*/
	/* ************************************************************************* */
	/* On crée la base de la sauvegarde de la base de données de test et ses fichiers */
	SET @sql = 'CREATE DATABASE ' + @nom_base_sauvegarde_test +
				'	ON' +
				'	(NAME = ' + @nom_base_sauvegarde_test +',' +
				'		FILENAME = ''' + @emplacement_fic_donnees + @nom_base_sauvegarde_test + '.mdf''' +
				'	)' +
				'	LOG ON' +
				'	(NAME = ' + @nom_base_sauvegarde_test + '_Log,' +
				'	FILENAME = ''' + @emplacement_fic_donnees + @nom_base_sauvegarde_test + '_Log.ldf''' +
				'	);'
	EXEC(@sql)
 
	/* Restauration de la base de test dans la base de sauvegarde de la base test */
	SET @sql = 'RESTORE DATABASE ' + @nom_base_sauvegarde_test +
				'	FROM DISK = ''' + @emplacement_sauvegarde + @date_du_jour + '_BACKUP_'+@nom_base_test + '''' +
				'	WITH REPLACE, RECOVERY, FILE=1,' +
				'	MOVE ''' + @nom_base_test + '''  TO ''' + @emplacement_fic_donnees + @nom_base_sauvegarde_test+ '.mdf''' + 
				'	MOVE ''' + @nom_base_test + '_Log'' TO ''' + @emplacement_fic_donnees + @nom_base_sauvegarde_test+ '_Log.ldf'';'
	EXEC(@sql)
 
	/*Modification du fichier data*/
	SET @sql = 'ALTER DATABASE' + 
				'	' + @nom_base_test +' ' +
				'MODIFY FILE' + 
				'	(NAME= N''' + @nom_base_test +''',' +
				'	NEWNAME= N''' + @nom_base_sauvegarde_test +''');'
	EXEC(@sql)
 
	/*Modification du fichier de log*/
	SET @sql = 'ALTER DATABASE' +
				'	' + @nom_base_test +'_Log ' +
				'MODIFY FILE' + 
				'	(NAME= N''' + @nom_base_test + ''',' + 
				'	NEWNAME= N''' + @nom_base_sauvegarde_test +'_Log'');'
	EXEC(@sql)
 
	/* Suppression de la base de test */
	SET @sql = 'DROP DATABASE ' + @nom_base_test +';'
	EXEC(@sql)
END;
 
 
/* ************************************************************************** */
/* Sauvegarde de copie seulement de la base de données de production avec contrôle d'intégrité */
/* ************************************************************************* */
 
SET @sql = 'BACKUP DATABASE ' + @nom_base_production + ' ' +
			'TO DISK = ''' + @emplacement_sauvegarde + @date_du_jour + '_BACKUP_'+ @nom_base_production + '.BAK'' ' +
			'WITH FORMAT, CHECKSUM, COPY_ONLY;'
EXEC(@sql)
 
/* ************************************************************************* */
/* Restauration de la base de production dans la base test					*/
/* ************************************************************************* */
 
/* On crée la base de données de test et ses fichiers */
SET @sql = 'CREATE DATABASE ' + @nom_base_test + ' ' +
			' ON ' +
			' (NAME = ' + @nom_base_test + ', ' +
			' 	FILENAME = ''' + @emplacement_fic_donnees + @nom_base_test + '.mdf'' ' +
			' ) ' +
			' LOG ON ' +
			' (NAME = ' + @nom_base_test + '_Log, ' +
			' 	FILENAME = ''' + @emplacement_fic_donnees + @nom_base_test + '_Log.ldf'' ' +
			' );'
EXEC(@sql)
 
/* Restauration de la base de production dans la base test */
SET @sql = 'RESTORE DATABASE ' + @nom_base_test + ' ' + 
			' FROM DISK = ''C:\Poubelle\20190326_1_backup_ERPALEX.bak'' ' + 
			' WITH REPLACE, RECOVERY, FILE=1, ' +
			' MOVE ''' + @nom_base_production + '''  TO ''' + @emplacement_fic_donnees + @nom_base_production + '.mdf'', ' + 
			' MOVE ''' + @nom_base_production + '_Log'' TO ''' + @emplacement_fic_donnees + @nom_base_production + '_Log.ldf''; '
EXEC(@sql)
 
/*Modification du fichier data*/
SET @sql = 'ALTER DATABASE ' + 
					'	'+ @nom_base_test + ' ' +
					'MODIFY FILE ' + 
					'	(NAME= N'''+ @nom_base_production + ''', ' + 
					'	NEWNAME= N'''+ @nom_base_test + ''');'
EXEC(@sql)
 
/*Modification du fichier de log*/
SET @sql = 'ALTER DATABASE ' +
					'	'+ @nom_base_test + ' ' +
					'MODIFY FILE ' + 
					'	(NAME= N'''+ @nom_base_production + '_Log'', ' + 
					'	NEWNAME= N'''+ @nom_base_test + '_Log'');'
EXEC(@sql)
 
 
/* ************************************************************************* */
/* Modification de la nouvelle base test									 */
/* ************************************************************************* */
/* On utilise la nouvelle base test */
SET @sql = 'USE ' + @nom_base_test + ';'
EXEC(@sql)
 
/* On ajoute TEST aux noms de dossiers */
SET @sql = 'UPDATE SOC SET SOC.NOM =RTRIM(LTRIM(SOC.NOM)) +'' ***TEST***'' WHERE SOC.DOS = 100 AND LTRIM(RTRIM(SOC.NOM)) = ''ASP''';
EXEC(@sql)
 
/* On ajoute TEST à tous les noms d'établissement */
SET @sql = 'UPDATE ETS SET ETS.NOM =RTRIM(LTRIM(ETS.NOM)) +'' TEST'' WHERE ETS.DOS = 100;'
EXEC(@sql)
 
/* Modification des chemins */
SET @sql = 'UPDATE MCHEMIN SET CHEMIN = REPLACE(RTRIM(LTRIM(CHEMIN)),''Ficjoints_exploit'',''ficjoints_test'') WHERE CHEMIN LIKE ''%Ficjoints_exploit%'';'
EXEC(@sql)
SET @sql = 'UPDATE MCHEMIN SET CHEMIN = REPLACE(RTRIM(LTRIM(CHEMIN)),''//Alex2/myerp/wpartage'',''//Alex2/myerp/wpartagetest'') WHERE CHEMIN LIKE ''%//Alex2/myerp/wpartage%'';'
EXEC(@sql)
SET @sql = 'UPDATE MCHEMIN SET CHEMIN = REPLACE(RTRIM(LTRIM(CHEMIN)),''wpartage'',''wpartage_test'') WHERE CHEMIN LIKE ''%wpartage%'' AND CHEMIN NOT LIKE ''%wpartagetest%'';'
EXEC(@sql)
SET @sql = 'UPDATE MCHEMIN SET CHEMIN = REPLACE(RTRIM(LTRIM(CHEMIN)),''//Alex2/myerp/edi/prod'',''//Alex2/edi/TEST'') WHERE CHEMIN LIKE ''%//Alex2/myerp/edi/prod%'';'
EXEC(@sql)
SET @sql = 'UPDATE MCHEMIN SET CHEMIN = REPLACE(RTRIM(LTRIM(CHEMIN)),''\\Alex2\extraction\'',''\\Alex2\wpartage_test\'') WHERE CHEMIN LIKE ''%\\Alex2\extraction\%'';'
EXEC(@sql)
Voici les erreurs que j'obtiens, alors que je ne vois pas d'appels de procédures stockées :

Nom : Capture.PNG
Affichages : 1369
Taille : 23,6 Ko

Auriez-vous des pistes sur l'origine du problème s'il vous plaît?

Bonne journée,

Alexandre