Bonjour,
J'ai besoin de pouvoir transférer régulièrement certaines procédures stockées d'une base SQL Serveur vers une autre.
Je pense effectuer ce traitement dans les travaux planifiés (de nuit)
Pour transférer une procédure stockée j'ai écrit le code suivant qui reçoit en paramètre le nom de la procédure à copier. Il fonctionne sur la base Cible.
:
Ca fonctionne parfaitement.
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 BEGIN Declare @LC_Texte VarChar(max) Declare @LC_Texte2 VarChar(8000) Declare @LN_Procedure Int -- récupérer le texte de la procédure stockée SET @LC_Texte = '' SELECT @LC_Texte = @LC_Texte + COALESCE(Source.dbo.syscomments.Text, '') FROM Source.dbo.syscomments, Source.dbo.sysobjects WHERE Source.dbo.syscomments.id = sysobjects.id AND Source.dbo.sysobjects.xtype = 'P' AND Source.dbo.sysobjects.name = @PC_Procedure -- tester et détruire Set @LN_Procedure = (SELECT Count(*) FROM sys.objects Where Name = @PC_Procedure) If @LN_Procedure > 0 Begin Set @LC_Texte2 = 'DROP PROCEDURE ' + @PC_Procedure --Execute (@LC_Texte2) End -- créer la nouvelle version Execute (@LC_Texte) END
Où les choses se gâtent c'est lorsque je veux enfermer cela dans un job
Je voudrais sélectionner les n bases Cibles et appeler pour chacune la procédure stockée
J'ai ce code dans le Maintenance Plans
Là j'ai un message d'erreur que je comprends pas et qui m'énerve.
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 Declare @LC_Commande VarChar(50) Declare @LC_Base VarChar(50) declare @return_value int DECLARE TmpCopy_cursor CURSOR FOR Select BaseSQL From Source.dbo.Table Where BaseSQL is not Null And BaseSQL <> '' Open TmpCopy_cursor fetch next from TmpCopy_cursor WHILE @@FETCH_STATUS = 0 BEGIN fetch next from TmpCopy_cursor Set @LC_Commande = 'USE [' + @LC_Base + '] ' Execute(@LC_Commande) Execute CopyProcStock('Procedure1') Execute CopyProcStock('Procedure2') etc... End CLOSE TmpCopy_cursor DEALLOCATE TmpCopy_cursor
Je suppose que de faire un Insert Select des tables Source.dbo.syscomments, Source.dbo.sysobjects serait dangereux et je n'ose pas trop m'y risquer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Msg 166, Level 15, State 1, Line 1 'DROP PROCEDURE' does not allow specifying the database name as a prefix to the object name.
Partager