Bonjour,
Vous n'avez que la première ligne parce que le code de la procédure stockée contient les retours à la ligne.
Or quand vous faites appel à la procédure stockée système étendue xp_cmdshell, vous exécutez une commande DOS : dès que l'interpréteur de commandes DOS rencontre un retour chariot, il exécute la commande.
Avec la commande ECHO, vous ne pouvez pas dépasser 255 caractères, et il n'est pas rare d'avoir des procédures plus longues que 255 caractères 
C'est dommage d'écrire :
1 2
| SET @requete ='EXEC master..xp_cmdshell '''+@cmd+''''
exec(@requete) |
Alors que pouvez faire directement :
EXEC master.dbo.xp_cmdshell @cmd, NO_OUTPUT
Si donc vous souhaitez exporter le code de votre procédure stockée, voici un exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13
| SELECT SQL.definition + CHAR(10) + CHAR(13) + 'GO' toto
INTO ##TOTO
FROM sys.procedures PROCS
JOIN sys.sql_modules SQL ON SQL.object_id = PROCS.object_id
WHERE PROCS.name NOT LIKE 'dt%'
AND PROCS.name NOT LIKE 'sp%'
ORDER BY PROCS.name
DECLARE @BCP VARCHAR(256);
SET @BCP = 'bcp "SELECT * FROM ##TOTO" queryout C:\Procs.sql -T -c';
EXEC xp_cmdshell @BCP;
DROP TABLE ##TOTO; |
Il a le désavantage d'utiliser une table temporaire globale, en revanche cela s'exécute très vite et exporte le code complet 
@++
Partager