Afficher les resultat d'une procedure stockee dans un fichier ex

Signaler
Messages postés
2
Date d'inscription
mercredi 14 août 2013
Statut
Membre
Dernière intervention
15 août 2013
-
 minoucha.B -
Bonjour,

J'ai fait une procedure stockee qui selectionne des datas d'une table, les comparer avec une autre tqble pour une date donnee et puis afficher les commentaires voulu...

je veux bien que le resultat de cette procedure soit stockee dans un fichier excel dans le but d'envoyer le fichier comme rapport.

J'ai essayer d'utiliser qq chose comme ceci [OPENROWSET (Transact-SQL)] mais un message d'erreur s'affiche tjrs et g rien compris.

est ce que qq1 peut m'aider et merci..

8 réponses

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
18
Salut,

je te conseille plutot l'utilisation de BCP qui est beaucoup plus souple et paramétrable, voici un exemple d'export vers un fichier csv ou xls à partir d'une requete (tout se fait en mode texte) :


/* la requete d'extraction des données à exporter */
/* Exemple avec selection des 5 premières tables dont le nom ne commence pas par 'w' ou 'z' */
DECLARE @requete varchar(1000)
SET @requete = 'SELECT top 5 * FROM '+db_name()+'.sys.tables WHERE name like ''[^w,z]%''';

/* Le fichier d'export */
DECLARE @ficExport varchar(255)
SET @ficExport = 'D:\testExport.csv'

/* La commande bcp avec login et pass de la connexion SQL (-U et -P) */
/* "-c" utilise le type caractère pour l'export */
/* "-t;" permet de forcer le caractère séparateur ';' à la place de tabulation */
DECLARE @cmd varchar(4000)
SET @cmd = 'bcp "'+@requete+'" queryout "'+@ficExport+'" -c -t; -Usa -Psql'


/* Facultatif, table de redirection des traces de la console */
/* Permet de ne pas polluer la sortie si exécutée dans une procédure stockée */
DECLARE @OUT table(_id int identity(1,1), _out varchar(1024));

/* Execute la commande */
INSERT INTO @OUT( _out )
EXEC xp_cmdshell @cmd

/* Affiche les traces du bcp */
SELECT * FROM @OUT WHERE _out is not null ORDER BY _id



bye...
Messages postés
2
Date d'inscription
mercredi 14 août 2013
Statut
Membre
Dernière intervention
15 août 2013

Merci bien pour ton aide 'yann_lo_san' mais le problem persiste encore... toujours des messages d'erreur ....
Je suis nouvelle dans le domaine de SQL surtout avec les procedures et les fonctions c pour cette raison que je suis toujours stressee :(
Je dois finir cette procedure le plutot possible mais....
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
18
Re,

et bien postes le morceau de code qui plante et mets aussi les erreurs qui s'affichent.

bye...
Re,

dsl pour le retard...
voici l'erreur qui s'affiche

Msg 15281, Level 16, State 1, Procedure xp_cmdshell, Line 1
SQL Server blocked access to procedure 'sys.xp_cmdshell' of component 'xp_cmdshell' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'xp_cmdshell' by using sp_configure. For more information about enabling 'xp_cmdshell', see "Surface Area Configuration" in SQL Server Books Online.
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
18
Re,

Il faut qu'un administrateur du serveur sql (un compte avec le profil dba ou sa) exécute ce script pour activer la fonction d'accès au shell :

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'xp_cmdshell', 1;
GO
RECONFIGURE;
GO


bye...
Merci une autre fois.

Maintenant le probleme que j'ai rencontre, c'est que l'affichage n'est pas bien reparti (dans le sens que j'obtiens trop de lignes vides entre le numero de client par exemple et le nom ou quelque chose comme ca) voici le code et l'affichage:

DECLARE LINES CURSOR FOR
SELECT

distinct(IdClient )
, FullName
, Orig_Residence
, New_Residence
, Orig_ClientType
, New_ClientType
, Orig_Influence
, New_Influence
, Orig_Country
, New_Country
, Orig_Status
, New_Status
, Orig_CTR
, New_CTR

FROM #OUTPUT
OPEN LINES
SET @num = (SELECT count(distinct(IdClient)) FROM #OUTPUT)
SET @Counter = 0

WHILE @Counter<@num

BEGIN
FETCH NEXT FROM LINES
INTO
@IdClient
, @FullName
, @Orig_Residence
, @New_Residence
, @Orig_ClientType
, @New_ClientType
, @Orig_Influence
, @New_Influence
, @Orig_Country
, @New_Country
, @Orig_Status
, @New_Status
, @Orig_CTR
, @New_CTR

IF (@Orig_Residence<>@New_Residence OR @Orig_ClientType <>@New_ClientType OR @Orig_Influence <>@New_Influence OR @Orig_Country <>@New_Country) -- OR @Orig_Status <>@New_Status )
BEGIN
INSERT INTO #PRINTTOFILE VALUES ('')
INSERT INTO #PRINTTOFILE VALUES('The Client with ID '+@IdClient+' "'+@FullName+'" changed.')
END
IF @Orig_Residence<>@New_Residence
BEGIN
INSERT INTO #PRINTTOFILE VALUES ('* His Residence Status Value has been changed from "'+CONVERT(nvarchar,@Orig_Residence) +'" to "' +CONVERT(nvarchar,@New_Residence)+'"')
END
IF (@Orig_Residence=@New_Residence OR @Orig_Residence=ISNULL(@New_Residence,0))
BEGIN
INSERT INTO #PRINTTOFILE VALUES ('')
END
IF @Orig_ClientType <>@New_ClientType
BEGIN
INSERT INTO #PRINTTOFILE VALUES ('* His Client Type Value has been changed from "'+CONVERT(nvarchar, @Orig_ClientType)+'" to "' +CONVERT(nvarchar,@New_ClientType)+'"' )
END
IF (@Orig_ClientType=ISNULL(@New_ClientType,0)OR @Orig_ClientType=@New_ClientType) OR @Orig_ClientType =@New_ClientType
BEGIN
INSERT INTO #PRINTTOFILE VALUES ('')
END
IF (@Orig_Influence =@New_Influence OR @Orig_Influence =ISNULL(@New_Influence,0))
BEGIN
INSERT INTO #PRINTTOFILE VALUES ('')
END
IF @Orig_Influence <>@New_Influence
BEGIN
INSERT INTO #PRINTTOFILE VALUES ('* His Influence Value has been changed from "'+CONVERT(nvarchar,@Orig_Influence)+'" to "' +CONVERT(nvarchar,@New_Influence)+'"')
END
IF @Orig_Country <>@New_Country
BEGIN
SET @Orig_CTR= (SELECT dbo.Cls_Countries.DescrEng FROM dbo.Cls_Countries WHERE @Orig_Country=dbo.Cls_Countries.CountryId)
SET @New_CTR= (SELECT dbo.Cls_Countries.DescrEng FROM dbo.Cls_Countries WHERE @New_Country=dbo.Cls_Countries.CountryId)
INSERT INTO #PRINTTOFILE VALUES ('* His Country has been changed from "' +@Orig_CTR+'" to "' +@New_CTR+'" ( Country ID: ' +CONVERT(nvarchar,@Orig_Country)+' to: ' +CONVERT(nvarchar,+@New_Country) +' )')
END
IF (@Orig_Country =@New_Country OR @Orig_Country =ISNULL(@New_Country,0))
BEGIN
INSERT INTO #PRINTTOFILE VALUES ('')
END
SET @Counter = @Counter + 1
END


CLOSE LINES
DEALLOCATE LINES




et l'affichage est:

The Client with ID 262 "Steiner Kurt Hannes" changed.




* His Country has been changed from "Austria" to "Germany"



donc il y a trop d'espace entre les lignes.... :(
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
18
salut,

ben enlève les insert à vide :
INSERT INTO #PRINTTOFILE VALUES ('')

sinon le bcp marche ?

bye...
Bonjour,

merci bien, je les enlevés déjà, j'ai eu l'attention mais il me reste encore un seul problème d'affichage:

The Client with ID 335 "Szabó Iulia " changed.
* His Country has been changed from "Romania" to "Germany" ( Country ID: 642 to: 276 )

The Client with ID 335 "Szabó Iulia " changed.
* His Residence has been changed from "1" to "2"


le probleme c'est que je veux lister tous les changements du client directement sous son nom, comme:

The Client with ID 335 "Szabó Iulia " changed.
* His Country has been changed from "Romania" to "Germany" ( Country ID: 642 to: 276 )
* His Residence has been changed from "1" to "2"

je veux plus répéter le nom du client a chaque fois.

J'ai poste déjà le code (le même de la dernière fois)...


Pour le bcp ca pas marche mais merci beaucoup, j'en ai pas besoin parce que je l'ai réglé a travers le programme d'intégration.


Merci :)