Text verpacken, wenn Spaltenname zu lang ist?

Ich habe dieses Skript, das eine E-Mail sendet:

USE msdb EXEC sp_send_dbmail @profile_name = 'Mail list', @recipients = 'bob.jones@company.com', @subject = 'query results', @body = 'Result from SELECT appended below.', @execute_query_database = 'DB', @query = 'exec usp_DisplayData' 

Das Problem ist, dass viele der Spalten (oder ihre Alias) sind unglaublich lang, so dass die Abfrage Ergebnis in der E-Mail wird so etwas aussehen:

 SDMI POS Sales Name SDMI POS Purchases ------------------- ------------------ 1 Joe 3 

Ohne HTML, gibt es einen path, dass ich den Text in den Spalten wickeln kann, also wird es so etwas in der E-Mail aussehen?

 SDMI POS Name SDMI POS Sales Purchases --------- ---- --------- 1 Joe 3 

usp_DisplayData ist eine einfache Abfrage, sieht so etwas aus:

 Create procedure usp_usp_DisplayData as select cast(sales as varchar(16)) as 'SDMI POS Sales', Name, cast(purch as varchar(16)) as 'SDMI POS Purchases', from Sales 

Sie haben kein Glück, wenn Sie versuchen, Zeilenumbrüche in Ihre Spalten-Aliase einzufügen. Normaler Text kehrt nach einem Zeilenumbruch immer zum ersten character zurück. Dies wird sich nicht der Spalten bewusst sein …

Wenn möglich (abhängig vom Zielsystem Ihrer eMail), sollten Sie HTML um eine Tabelle zu formatieren.

In deinem letzten Kommentar fragst du nach der function der verknüpften Antwort .

dbo.CreateHTMLTable() nimmt einen Parameter vom Typ XML als Eingabe (etwas mehr, wenn du die Version mit classnnamen nimmst) und gibt ein einzelnes XML zurück (das ist eigentlich XHTML).

Der Trick ist, dass das folgende ein einziges, skalares XML zurückgibt

 SELECT ( SELECT * FROM SomeWhere FOR XML RAW,TYPE ) AS TheXmlResult; 

Die innere SELECT kehrt als XML zurück, das ist in paranthesis eingehüllt, also wird es eine einzelne Spalte in der äußeren select . ( Details ELEMENTS XSINIL , lesen Sie den background der verknüpften Antwort ).

Der Anruf ist einfach (beachten Sie die doppelte Paranthese):

 SELECT dbo.CreateHTMLTable((***your select here*** FOR XML RAW,ELEMENTS XSINIL)) 

Das ist es … Der Rückgabewert ist das volle xhtml -Table.

sp_send_dbmail hat einen Parameter, um das Format als html anzugeben. Ich denke das ist

 @body_format = 'HTML' 

Btw: Falsche Verwendung eines gespeicherten Vorgangs

Ihre gespeicherte Prozedur ist das falsche Werkzeug für diese (Hämmern ein Nagel mit einer Bierflasche funktioniert, aber …)

 Create procedure usp_usp_DisplayData as select [...] 

SPs sind geschaffen , um etwas zu tun . Dein SP tut nichts anderes beim Lesen . Dies ist viel besser in eine VIEW verpackt oder, wenn es Parameter gibt, in eine Inline-Tabelle geschätzte function

Sie können diese SELECT direkt in die statement aufrufen, die oben die function aufruft

 DECLARE @body XML= ( SELECT dbo.CreateHTMLTable ( ( select cast(sales as varchar(16)) as 'SDMI POS Sales' ,Name ,cast(purch as varchar(16)) as 'SDMI POS Purchases' from Sales FOR XML RAW,ELEMENTS XSINIL ) ) );