OVH Cloud OVH Cloud

Export d'une procédure stockée dans un fichier

11 réponses
Avatar
Philippe T [MS]
Bonjour,

Pour une fois, c'est moi qui pose ma question !!! :-)

Voilà, je vous explique mon problème : je voudrais exporter dans un fichier
texte le text d'une procédure stockée.

Pour l'instant je fais comme cela :

DECLARE @cmd sysname, @var sysname
SET @var = 'osql -U Mon_Compte -P Mon_MotDePasse -S Mon_ServeurSQL -d
Ma_BaseDeDonnee -h-1 -w 4000 -I /Q "EXEC sp_helptext Ma_ProcedureStockée"'
SET @cmd = @var + ' > C:\SQL\test.txt'
EXEC master..xp_cmdshell @cmd

Le problème c'est que dans le fichier généré, il saute une ligne blanche
pour chaque ligne écrite dans le fichier ce qui ne me satisfait pas.

Y aurait-il une ame charitable qui serait solutionner ce problème ou me
trouver une autre solution ???

D'avance merci.

Phil.
________________________________________________________
Philippe TROTIN http://blogs.msdn.com/ptrotin
Microsoft Services France http://www.microsoft.com/france

1 réponse

1 2
Avatar
Philippe T [MS]
Bonjour,

Je confirme !!!

Le -w4000 correspond à définir au maximum des lignes de 4000 caractères mais
je sort bien l'ensemble des éléments de la procédure ordonné par le colid
(ORDER BY SysComments.colid) ce qui permet de récupérer tout le texte.

Merci pour le retour.

Phil.
________________________________________________________
Philippe TROTIN http://blogs.msdn.com/ptrotin
Microsoft Services France http://www.microsoft.com/france

"Oliv'" <(supprimerceci) wrote in message
news:41de84a3$0$20001$
Salut à tous
Sp_helptext limite les sorties à 255 caractères pas lignes
Avec la solution de Philippe j'ai quelques erreurs des mots coupés et


passés
à la ligne
des accents mal interprétés mais je pense que pour cela il faut règler le
COLLATE.
Mais le test sur une procédure de 19660 caractères est OK.
Oliv'

"Nicolas LETULLIER" a écrit dans le
message de news:
Bonjour,

Ne risque-t-il pas d'y avoir un problème si la procédure stockée dépasse


les
4000 caractères de code ?

Ci-dessous un exemple de procédure utilisant WMI pour (re)créer le script
d'une autre SP. Je n'y ai pas implémenté de gestion d'erreur.
J'y ai ajouté la possibilité de faire le DROP PROCEDURE.

Nicolas.

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


----------------------------------------------------------------------------
CREATE PROCEDURE sp_ProcedureScriptToFile(@StoredProc sysname, @FileName
varchar(255), @DropProcedure bit = 0) AS

DECLARE @FS int, @OLEResult int, @FileID int
DECLARE @Text nvarchar(255)

SET NOCOUNT ON

-- Création/alimentation table temporaire
CREATE TABLE #ResHelpText (Text nvarchar(255))
INSERT INTO #ResHelpText EXEC sp_HelpText @StoredProc

EXECUTE @OLEResult = sp_OACreate 'Scripting.FileSystemObject', @FS OUT
IF @OLEResult <> 0 PRINT 'Scripting.FileSystemObject'

--Ouvre le fichier (2 = ForWriting, 8 = ForAppending)
execute @OLEResult = sp_OAMethod @FS, 'OpenTextFile', @FileID OUT,
@FileName, 2, 1
IF @OLEResult <> 0 PRINT 'OpenTextFile'

IF (@DropProcedure = 1)
BEGIN
SET @Text = 'if exists (select * from dbo.sysobjects where id > object_id(N''[dbo].[' + @StoredProc + ']'') and OBJECTPROPERTY(id,
N''IsProcedure'') = 1)'
execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', Null, @Text
-- IF @OLEResult <> 0 -- Erreur
SET @Text = 'drop procedure [dbo].[' + @StoredProc + ']'
execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', Null, @Text
execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', Null, 'GO'
execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', Null, 'SET
QUOTED_IDENTIFIER OFF'
execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', Null, 'GO'
execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', Null, 'SET
ANSI_NULLS ON'
execute @OLEResult = sp_OAMethod @FileID, 'WriteLine', Null, 'GO'
END

DECLARE cr_HelpText CURSOR FOR SELECT Text FROM #ResHelpText
OPEN cr_HelpText
FETCH NEXT FROM cr_HelpText INTO @Text
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Text = REPLACE(@Text,CHAR(10)+CHAR(10),'') -- Première ligne


contient
#10#10
execute @OLEResult = sp_OAMethod @FileID, 'Write', Null, @Text
-- IF @OLEResult <> 0 -- Erreur
FETCH NEXT FROM cr_HelpText INTO @Text
END
CLOSE cr_HelpText
DEALLOCATE cr_HelpText

EXECUTE @OLEResult = sp_OADestroy @FileID
EXECUTE @OLEResult = sp_OADestroy @FS

DROP TABLE #ResHelpText

SET NOCOUNT OFF
GO

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


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

"Philippe T [MS]" a écrit dans le message


de
news:
> Bonjour,
>
> Pour information, voici ce que j'ai fait et qui fonctionne très bien :
>
> 1er BATCH :
>
> CALL SQL_Generate cp_AddressDeleteByAddressId -- C'est le nom


d'une
> procédure
>
> 2ème BATCH :
>
> @ECHO OFF
> REM ----------------------------------------
> REM -
> REM ----------------------------------------
> ECHO if exists (select * from dbo.sysobjects where id > > object_id(N'[dbo].[%1]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) >
> %1_Entete.sql
> ECHO drop procedure [dbo].[%1] >> %1_Entete.sql
> ECHO GO >> %1_Entete.sql
> ECHO. >> %1_Entete.sql
> ECHO SET QUOTED_IDENTIFIER OFF >> %1_Entete.sql
> ECHO GO >> %1_Entete.sql
> ECHO SET ANSI_NULLS ON >> %1_Entete.sql
> ECHO GO >> %1_Entete.sql
> ECHO. >> %1_Entete.sql
>
> REM ----------------------------------------
> REM -
> REM ----------------------------------------
> CALL osql -Usa -Psa -SMon_Server -dMaBase -h-1 -s"" -w4000 /Q"SET


NOCOUNT
> ON;SELECT SysComments.text FROM SysObjects INNER JOIN SysComments ON
> SysObjects.id = SysComments.id WHERE SysObjects.name = '%1' COLLATE
> database_default ORDER BY SysComments.colid" -o c:sql%1_Corp.sql
>
> REM ----------------------------------------
> REM -
> REM ----------------------------------------
> COPY %1_Entete.sql+%1_Corp.sql %1.sql
> DEL c:SQL%1_Entete.sql
> DEL c:SQL%1_Corp.sql
>
>
> Merci beaucoup à toi à à Oliv'
>
> Phil.
> ________________________________________________________
> Philippe TROTIN http://blogs.msdn.com/ptrotin
> Microsoft Services France http://www.microsoft.com/france
>
> "Med Bouchenafa" wrote in message
> news:#
>> Vraiment bizarre ce comportement de OSQL alors que le problème ne se


pose
> pas avec l'analyseur de
>> requêtes
>> Je te propose d'utiliser ISQLW à la place de OSQL.
>> Je viens de faire le test et il est concluant même si je ne comprends


pas
> le pourquoi de ce
>> comportement !!!!
>> Voici ce que j'ai utilisé
>> DECLARE @var sysname
>> SET @var = 'isqlw -E -d Master -i "c:queryIN.sql" -o


"c:queryOut.txt"'
>> EXEC master..xp_cmdshell @var
>>
>> Comme tu vois, la syntaxe est très proche de celle d'OSQL
>>
>>
>> --
>> Bien cordialement
>> Med Bouchenafa
>>
>>
>> "Philippe T [MS]" a écrit dans le


message
> de news:
>>
>> > Bonjour,
>> >
>> > J'avais déja essayé :
>> >
>> > DECLARE @cmd sysname, @var sysname
>> > SET @var = 'osql -U Mon_Compte -P Mon_MotDePasse -S Mon_ServeurSQL -d
>> > Ma_BaseDeDonnee -h-1 -w 4000 -I -Q "EXEC sp_helptext
> Ma_ProcedureStockée" -o
>> > c:sqltest.sql'
>> > EXEC master..xp_cmdshell @cmd
>> >
>> > Mais sans succès. :-(
>> >
>> > Phil.
>> > ________________________________________________________
>> > Philippe TROTIN


http://blogs.msdn.com/ptrotin
>> > Microsoft Services France http://www.microsoft.com/france
>> >
>> > "Med Bouchenafa" wrote in message
>> > news:etg#
>> > > Pourquoi ne pas tout simplement rediriger la sortie de OSQL vers un
>> > fichier.
>> > > Il existe l'option -o pour cela.
>> > > --
>> > > Bien cordialement
>> > > Med Bouchenafa
>> > >
>> > > "Philippe T [MS]" a écrit dans le
> message
>> > de
>> > > news:
>> > > > Bonjour,
>> > > >
>> > > > Pour une fois, c'est moi qui pose ma question !!! :-)
>> > > >
>> > > > Voilà, je vous explique mon problème : je voudrais exporter dans


un
>> > > > fichier
>> > > > texte le text d'une procédure stockée.
>> > > >
>> > > > Pour l'instant je fais comme cela :
>> > > >
>> > > > DECLARE @cmd sysname, @var sysname
>> > > > SET @var = 'osql -U Mon_Compte -P Mon_MotDePasse -S
> Mon_ServeurSQL -d
>> > > > Ma_BaseDeDonnee -h-1 -w 4000 -I /Q "EXEC sp_helptext
>> > Ma_ProcedureStockée"'
>> > > > SET @cmd = @var + ' > C:SQLtest.txt'
>> > > > EXEC master..xp_cmdshell @cmd
>> > > >
>> > > > Le problème c'est que dans le fichier généré, il saute une ligne
> blanche
>> > > > pour chaque ligne écrite dans le fichier ce qui ne me satisfait
>> > > > pas.
>> > > >
>> > > > Y aurait-il une ame charitable qui serait solutionner ce problème
>> > > > ou
> me
>> > > > trouver une autre solution ???
>> > > >
>> > > > D'avance merci.
>> > > >
>> > > > Phil.
>> > > > ________________________________________________________
>> > > > Philippe TROTIN
> http://blogs.msdn.com/ptrotin
>> > > > Microsoft Services France
>> > > > http://www.microsoft.com/france
>> > > >
>> > > >
>> > >
>> > >
>> >
>> >
>>
>>
>
>





1 2