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

10 réponses

1 2
Avatar
Oliv'
Salut Philippe,
Je crois avoir une solution pour toi.
ajoute cela :
DECLARE @cmd1 varchar(4000)
set @cmd1 = 'find /v /i "
" c:SQLtest.txt >c:SQLtoto.txt'
print @cmd1
EXEC master..xp_cmdshell @cmd1
---pour supprimer le fichier inutile
Select @cmd1 = 'del ' + 'c:SQLtest.txt'
Exec master.dbo.xp_cmdshell @Cmd1, no_output

Mon test marche sur XP mais des lignes peuvent êtres coupées et passées à la
ligne (+255 caractères) ce qui fait que la procédure ne peut être utilisée
avant contrôle
mais cela vient de sp_helptext je pense

Oliv'


"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
Avatar
Med Bouchenafa
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




Avatar
Philippe T [MS]
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
>
>




Avatar
Philippe T [MS]
Bonjour,

Tout d'abord merci de ta réponse. Je ne réussi pas à faire fonctionner ton
exemple.

set @cmd1 = 'find /v /i "
" c:SQLtest.txt >c:SQLtoto.txt'

Quel est le caractère que tu recherche dans le find ???

Merci.

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

"Oliv'" <(supprimerceci) wrote in message
news:41dc39b9$0$12396$
Salut Philippe,
Je crois avoir une solution pour toi.
ajoute cela :
DECLARE @cmd1 varchar(4000)
set @cmd1 = 'find /v /i "
" c:SQLtest.txt >c:SQLtoto.txt'
print @cmd1
EXEC master..xp_cmdshell @cmd1
---pour supprimer le fichier inutile
Select @cmd1 = 'del ' + 'c:SQLtest.txt'
Exec master.dbo.xp_cmdshell @Cmd1, no_output

Mon test marche sur XP mais des lignes peuvent êtres coupées et passées à


la
ligne (+255 caractères) ce qui fait que la procédure ne peut être utilisée
avant contrôle
mais cela vient de sp_helptext je pense

Oliv'


"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





Avatar
Oliv'
Bonjour,
En fait tu ouvres ton fichier test.txt, tu selectionnes toute une ligne (à
supprimer) puis copier coller.
cela semble une ligne vide mais il y a des espaces en fait
Oliv'
"Philippe T [MS]" a écrit dans le message de
news:
Bonjour,

Tout d'abord merci de ta réponse. Je ne réussi pas à faire fonctionner ton
exemple.

set @cmd1 = 'find /v /i "
" c:SQLtest.txt >c:SQLtoto.txt'

Quel est le caractère que tu recherche dans le find ???

Merci.

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

"Oliv'" <(supprimerceci) wrote in message
news:41dc39b9$0$12396$
Salut Philippe,
Je crois avoir une solution pour toi.
ajoute cela :
DECLARE @cmd1 varchar(4000)
set @cmd1 = 'find /v /i "
" c:SQLtest.txt >c:SQLtoto.txt'
print @cmd1
EXEC master..xp_cmdshell @cmd1
---pour supprimer le fichier inutile
Select @cmd1 = 'del ' + 'c:SQLtest.txt'
Exec master.dbo.xp_cmdshell @Cmd1, no_output

Mon test marche sur XP mais des lignes peuvent êtres coupées et passées à


la
ligne (+255 caractères) ce qui fait que la procédure ne peut être utilisée
avant contrôle
mais cela vient de sp_helptext je pense

Oliv'


"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





Avatar
Philippe T [MS]
Bonjour,

Merci de la réponse. Je vais tester.

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

"Oliv'" <(supprimerceci) wrote in message
news:41dd0096$0$13355$
Bonjour,
En fait tu ouvres ton fichier test.txt, tu selectionnes toute une ligne (à
supprimer) puis copier coller.
cela semble une ligne vide mais il y a des espaces en fait
Oliv'
"Philippe T [MS]" a écrit dans le message


de
news:
Bonjour,

Tout d'abord merci de ta réponse. Je ne réussi pas à faire fonctionner ton
exemple.

set @cmd1 = 'find /v /i "
" c:SQLtest.txt >c:SQLtoto.txt'

Quel est le caractère que tu recherche dans le find ???

Merci.

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

"Oliv'" <(supprimerceci) wrote in message
news:41dc39b9$0$12396$
> Salut Philippe,
> Je crois avoir une solution pour toi.
> ajoute cela :
> DECLARE @cmd1 varchar(4000)
> set @cmd1 = 'find /v /i "
> " c:SQLtest.txt >c:SQLtoto.txt'
> print @cmd1
> EXEC master..xp_cmdshell @cmd1
> ---pour supprimer le fichier inutile
> Select @cmd1 = 'del ' + 'c:SQLtest.txt'
> Exec master.dbo.xp_cmdshell @Cmd1, no_output
>
> Mon test marche sur XP mais des lignes peuvent êtres coupées et passées


à
la
> ligne (+255 caractères) ce qui fait que la procédure ne peut être


utilisée
> avant contrôle
> mais cela vient de sp_helptext je pense
>
> Oliv'
>
>
> "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
>
>
>





Avatar
Med Bouchenafa
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
> >
> >
>
>




Avatar
Philippe T [MS]
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
> > >
> > >
> >
> >
>
>




Avatar
Nicolas LETULLIER
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
> > >
> > >
> >
> >
>
>








Avatar
Oliv'
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