Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Procedure pour modifier en masse des procédures

4 réponses
Avatar
Philippe
Bonjour,

j'avoue que je n'ai pas trop cherché, mais existe t il une possibilité pour
corriger en masse un ensemble de procédures?
Je m'explique, j'ai une BD: myBD qui contient des procedures faisant
référence à une autre DB : myBDTemp,
exemple : "Select myData from myBDTemp.dbo.myTable "

Si je crée maintenant une nouvelle base : myBD2 copie de myBD, je veux que
toutes les proc qui font référence à myDBTemp, soient corrigées pour
référencer myDB2Temp.

Merci pour votre aide

Philippe

4 réponses

Avatar
WOLO Laurent
Le mieux serais de regénér le script de création de tes procédures de faire
du rechercher remplacer et des les rejouer, c'est simple et éfficace.

Merci.

"Philippe" a écrit :

Bonjour,

j'avoue que je n'ai pas trop cherché, mais existe t il une possibilité pour
corriger en masse un ensemble de procédures?
Je m'explique, j'ai une BD: myBD qui contient des procedures faisant
référence à une autre DB : myBDTemp,
exemple : "Select myData from myBDTemp.dbo.myTable "

Si je crée maintenant une nouvelle base : myBD2 copie de myBD, je veux que
toutes les proc qui font référence à myDBTemp, soient corrigées pour
référencer myDB2Temp.

Merci pour votre aide

Philippe





Avatar
Julien Bonnier
Si le cas le permet peut-etre passer les noms (myDB2Test) en parametre pour
eviter les mots de tetes eventuels...


"WOLO Laurent" wrote in message
news:
Le mieux serais de regénér le script de création de tes procédures de
faire
du rechercher remplacer et des les rejouer, c'est simple et éfficace.

Merci.

"Philippe" a écrit :

Bonjour,

j'avoue que je n'ai pas trop cherché, mais existe t il une possibilité
pour
corriger en masse un ensemble de procédures?
Je m'explique, j'ai une BD: myBD qui contient des procedures faisant
référence à une autre DB : myBDTemp,
exemple : "Select myData from myBDTemp.dbo.myTable "

Si je crée maintenant une nouvelle base : myBD2 copie de myBD, je veux
que
toutes les proc qui font référence à myDBTemp, soient corrigées pour
référencer myDB2Temp.

Merci pour votre aide

Philippe







Avatar
Philippe
Merci pour ces réponses
Pour l'instant j'en suis à la solution suggeré par Laurent, qui faute de
mieux , fait le travail.
Pasesr le nom de la base des tables en paramètres, signifie sql dynamique,
les procédures (environ 500) n'ont pas été construites comme cela et je ne
me vois pas les transformer.
j'aurai aimé quelque chose de systématique qui tiennent compte de toutes les
procédures, fonctions, Vues.. à l'instant T et qui puisse prendre en
paramètre le nom de la base
J'ai bien trouvé la fonction système OBJECT_DEFINITION qui me donne le
source de l'object qui peut être une procédure, une fonction ou une vue,
mail il faut maintenant que je puisse en faire quelque chose...
àsuivre

Philippe



"Julien Bonnier" a écrit dans le message de news:

Si le cas le permet peut-etre passer les noms (myDB2Test) en parametre
pour eviter les mots de tetes eventuels...


"WOLO Laurent" wrote in message
news:
Le mieux serais de regénér le script de création de tes procédures de
faire
du rechercher remplacer et des les rejouer, c'est simple et éfficace.

Merci.

"Philippe" a écrit :

Bonjour,

j'avoue que je n'ai pas trop cherché, mais existe t il une possibilité
pour
corriger en masse un ensemble de procédures?
Je m'explique, j'ai une BD: myBD qui contient des procedures faisant
référence à une autre DB : myBDTemp,
exemple : "Select myData from myBDTemp.dbo.myTable "

Si je crée maintenant une nouvelle base : myBD2 copie de myBD, je veux
que
toutes les proc qui font référence à myDBTemp, soient corrigées pour
référencer myDB2Temp.

Merci pour votre aide

Philippe











Avatar
Philippe
Bonjour à tous,
J'ai pu arriver à mes fins, et pour ceux que cela interrese voici le script
fonctionne sous SQL2005
Il faur être COURANT de la BASE à modifier , afin d'utiliser la fonction
Système OBJECT_DEFINITION
(http://msdn2.microsoft.com/en-us/library/ms176090.aspx)

---------------------------------

Declare @Object_id bigint
Declare @Object_Type char(2)
Declare @DescType nvarchar(16)
Declare @Proc_Source nvarchar(max)
Declare @Err int

-- recherche de l'objet à modifier
select @object_id =object_id , @object_Type = type from sys.All_objects
where name = N'PRC_CIA_Test'
Select @Err = @@Error
Print ('object_id Error ' + cast(@Err as varchar(15)))
Print ('Object_id Number ' + cast(@object_id as varchar(15)))

--Obtention du source
SELECT @Proc_Source = OBJECT_DEFINITION (@Object_id);
Select @Err = @@Error
Print ('object_definition Error ' + cast( @Err as varchar(15)))
--Print @Proc_Source

-- Recherche si source concerné contient MyTempDB, nom de base à modifier
en MyTempDB2
DECLARE @Tmp int
SELECT @Tmp = charindex('myBDTemp', @Proc_Source)
Select @Err = @@Error
Print ('CHARINDEX myBDTemp Error ' + cast( @Err as varchar(15)))

-- Si le source est concerné..
IF @Tmp > 0
BEGIN
-- Le source arrive en CREATE on le bascule en ALTER
if @Obj_Type ='P' then select @DescType = N'PROCEDURE'
if @Obj_Type ='V' then select @DescType = N'VIEW'
SELECT @Proc_Source = REPLACE(@proc_source ,N'CREATE ' + @DescType
,N'ALTER ' + @DescType );
SELECT @Err = @@Error
Print ('CREATE --> ALTER Error ' + cast( @Err as varchar(15)))

-- on remplace dans le source MytempDB par MytempDB2
SELECT @Proc_Source = REPLACE(@proc_source ,N'MyTempDB',N'MyTempDB2');
Select @Err = @@Error
Print ('MyTempDB --> MyTempDB2 Error :' + cast( @Err as varchar(15)))

-- Une fois corrigé le source on l'execute pour mettre à jour l'objet
EXECUTE (@proc_source)
Select @Err = @@Error
Print ('Execute Error ' + cast( @Err as varchar(15)))
END
---------------------------

Il y a surement possibilité d'améliorer et de mieux securisé
On pourra ensuite faire une boucle préalable sur sys.All_objects et
utiliser ce script après transformation en procédure stockée avec le n°
d'objet en paramètre

Philippe



"Philippe" a écrit dans le message de news:

Merci pour ces réponses
Pour l'instant j'en suis à la solution suggeré par Laurent, qui faute de
mieux , fait le travail.
Pasesr le nom de la base des tables en paramètres, signifie sql
dynamique, les procédures (environ 500) n'ont pas été construites comme
cela et je ne me vois pas les transformer.
j'aurai aimé quelque chose de systématique qui tiennent compte de toutes
les procédures, fonctions, Vues.. à l'instant T et qui puisse prendre en
paramètre le nom de la base
J'ai bien trouvé la fonction système OBJECT_DEFINITION qui me donne le
source de l'object qui peut être une procédure, une fonction ou une vue,
mail il faut maintenant que je puisse en faire quelque chose...
àsuivre

Philippe



"Julien Bonnier" a écrit dans le message de news:

Si le cas le permet peut-etre passer les noms (myDB2Test) en parametre
pour eviter les mots de tetes eventuels...


"WOLO Laurent" wrote in message
news:
Le mieux serais de regénér le script de création de tes procédures de
faire
du rechercher remplacer et des les rejouer, c'est simple et éfficace.

Merci.

"Philippe" a écrit :

Bonjour,

j'avoue que je n'ai pas trop cherché, mais existe t il une possibilité
pour
corriger en masse un ensemble de procédures?
Je m'explique, j'ai une BD: myBD qui contient des procedures faisant
référence à une autre DB : myBDTemp,
exemple : "Select myData from myBDTemp.dbo.myTable "

Si je crée maintenant une nouvelle base : myBD2 copie de myBD, je veux
que
toutes les proc qui font référence à myDBTemp, soient corrigées pour
référencer myDB2Temp.

Merci pour votre aide

Philippe