2017-09-19 5 views
1

J'exporte des données à partir d'une table SQL Server vers un fichier .csv, puis j'utilise sp_send_email pour envoyer le fichier avec des données.SQL Server: ponctuation d'échappement dans la chaîne

Mon problème est avec cette valeur:

Cantata Number 212 "Peasants Cantata", BWV 212 

La valeur se divise en deux colonnes dans le fichier .csv qui obtient envoyé par courrier électronique. Cette valeur devrait être seulement dans une colonne.

Certains titres peuvent contenir une virgule qui doit être laissée dans la chaîne pour ces instances.

Par exemple:

Cantata Number 212 Peasants Cantata"  BWV 212" 

J'ai essayé cette méthode, mais ne fonctionne pas:

Remarque: Cette déclaration SELECT réside à l'intérieur d'une vue vw_WeeklyReport

SELECT TOP 100 PERCENT 
    '"' + [p].[Title] + '"' [Title] 
FROM 
    table 

Le code exporte les données et envoie un e-mail au fichier .csv:

BEGIN 
    SET NOCOUNT ON; 

    DECLARE @qry VARCHAR(8000); 

    -- Create the query, concatenating the column name as an alias 
    SET @Qry = 'SET NOCOUNT ON; SELECT Title FROM [vw_WeeklyReport] SET NOCOUNT OFF'; 

    -- Send the e-mail with the query results in attachment. 
    EXEC [msdb].[dbo].[sp_send_dbmail] 
       @profile_name = 'default', 
       @recipients = '[email protected]', 
       @subject = 'Weekly Report', 
       @body = 'An attachment has been included in this email.', 
       @query_attachment_filename = 'WeeklyRep.csv', 
       @query = @qry, 
       @attach_query_result_as_file = 1, 
       @query_result_separator = ',', 
       @query_result_width = 32767, 
       @query_result_no_padding = 1; 
END; 
+0

S'il est acceptable de supprimer les virgules, vous devriez utiliser 'replace' dans SQL pour faire exactement cela. – user2366842

+0

Certaines valeurs contiennent des virgules et il est nécessaire de laisser les virgules dans la chaîne. –

+0

L'autre option consisterait à retravailler l'exportation pour utiliser un délimiteur différent en plus d'une virgule, bien que cela soit probablement hors de la portée d'une seule question SO. – user2366842

Répondre

0

Changer votre requête dans le proc stocké à quelque chose comme ceci:

SET @Qry = 'SET NOCOUNT ON; SELECT replace(Title, ',', '') as Title FROM [vw_WeeklyReport] SET NOCOUNT OFF'; 

Notez ce n'est pas testé, mais devrait vous donner ce que vous cherchez. Ceci est sous la présomption que l'enlèvement des virgules est acceptable, comme indiqué dans le message initial. Si les virgules doivent rester intactes, la réponse n'est pas aussi simple.

0

Quand il y a des virgules (ou séparateurs) dans le domaine, ce champ doit être joint à des guillemets doubles et les guillemets doubles au sein doivent être échappées avec un autre guillemet:

"Cantata Number 212 ""Peasants Cantata"", BWV 212" 

Une fois les guillemets doubles sont Utilisé autour des champs, tous les champs contenant des guillemets doubles doivent également être entre guillemets et les guillemets entre guillemets aussi.

Vous pourriez peut-être rechercher une option pour exporter vers csv en utilisant des champs entre guillemets.

La suppression de toutes les virgules pourrait aussi être une option, mais vous perdriez alors quelques informations. Par contre, s'il n'y a qu'une seule colonne (comme dans votre instruction SELECT), il n'est pas du tout nécessaire d'utiliser csv. Un fichier texte brut peut être utilisé à la place.

+0

Il ya d'autres colonnes, je viens d'inclure celle qui me pose problème –

+0

@the_lone_note Ok, alors vous devrez formater le champ comme indiqué ci-dessus (ou peut-être utiliser une option d'exportation pour cela, le cas échéant). Ou remplacez "" 'par" "" 'dans votre champ. –