2012-08-28 1 views
2

я использую нечто похожее на примере C на этой странице MSDN: http://msdn.microsoft.com/en-us/library/ms190307.aspxsp_send_dbmail - форматирование строки в таблице как красный для предупреждения

DECLARE @tableHTML NVARCHAR(MAX) ; 

SET @tableHTML = 
    N'<H1>Work Order Report</H1>' + 
    N'<table border="1">' + 
    N'<tr><th>Work Order ID</th><th>Product ID</th>' + 
    N'<th>Name</th><th>Order Qty</th><th>Due Date</th>' + 
    N'<th>Expected Revenue</th></tr>' + 
    CAST ((SELECT td = wo.WorkOrderID,  '', 
        td = p.ProductID, '', 
        td = p.Name, '', 
        td = wo.OrderQty, '', 
        td = wo.DueDate, '', 
        td = (p.ListPrice - p.StandardCost) * wo.OrderQty 
       FROM AdventureWorks.Production.WorkOrder as wo 
       JOIN AdventureWorks.Production.Product AS p 
       ON wo.ProductID = p.ProductID 
       WHERE DueDate > '2004-04-30' 
       AND DATEDIFF(dd, '2004-04-30', DueDate) < 2 
       ORDER BY DueDate ASC, 
         (p.ListPrice - p.StandardCost) * wo.OrderQty DESC 
       FOR XML PATH('tr'), TYPE 
    ) AS NVARCHAR(MAX)) + 
    N'</table>' ; 

EXEC msdb.dbo.sp_send_dbmail @recipients='[email protected]', 
    @subject = 'Work Order List', 
    @body = @tableHTML, 
    @body_format = 'HTML' ; 

У меня есть столбец под названием рейтинг, который устанавливается на «Good» или «Плохо» по моей собственной логике. Я бы хотел, чтобы все линии, имеющие рейтинг «Плохие», имели красный фон. Я знаю, как это сделать в HTML, но не знаю, как это сделать с запросом «FOR XML», демонстрируемым в этом примере. Похоже, мне пришлось бы добавить атрибут к некоторым заявлениям TD, а не к другим.

ответ

3

Вы не можете сделать это напрямую. Требуется небольшой «ручной» HTML-код. Вот подход, который можно использовать.

Выберите хорошие и плохие записи в отдельном CTE и добавьте теги «td». для плохих добавляет информацию о стиле как-то.

Затем добавьте теги «tr» и объедините строки данных (UNION) и соедините их, используя для xmlpath.

Я упростил порядок по столбцам, но вы можете выбрать их в CTE и заказать результаты позже.

Примечание: Я тестировал выходной HTML и работает, но я не парень HTML, поэтому не возражайте, если в HTML-тегах есть какая-либо ошибка. Исправьте его.

DECLARE @tableHTML NVARCHAR(MAX) 
,@Data NVARCHAR (MAX)='' 
SET @tableHTML = 
N'<H1>Work Order Report</H1>' + 
N'<table border="1">' + 
N'<tr><th>Work Order ID</th><th>Product ID</th>' + 
N'<th>Name</th><th>Order Qty</th><th>Due Date</th>' + 
N'<th>Expected Revenue</th></tr>' 

;WITH CTE_Good AS 
(
SELECT   HTMLRowData= N'<td>'+STR(wo.WorkOrderID)+N'</td>' 
         +N'<td>'+STR(p.ProductID)+N'</td>' 
         +N'<td>'+p.Name+N'</td>' 
         +N'<td>'+STR(wo.OrderQty)+N'</td>' 
         +N'<td>'+CONVERT(VARCHAR(10),wo.DueDate,101)+N'</td>' 
         +N'<td>'+STR((p.ListPrice - p.StandardCost) * wo.OrderQty)+N'</td>' 
     FROM AdventureWorks.Production.WorkOrder as wo 
     JOIN AdventureWorks.Production.Product AS p 
     ON wo.ProductID = p.ProductID 
     WHERE DueDate > '2004-04-30' 
     AND DATEDIFF(dd, '2004-04-30', DueDate) < 2 
     --AND Rating = 'Good' 
) 
,CTE_Bad AS 
    (
    SELECT  HTMLRowData= N'<td><p style="color:red">'+STR(wo.WorkOrderID)+N'</p></td>' 
         +N'<td><p style="color:red">'+STR(p.ProductID)+N'</p></td>' 
         +N'<td><p style="color:red">'+p.Name+N'</p></td>' 
         +N'<td><p style="color:red">'+STR(wo.OrderQty)+N'</p></td>' 
         +N'<td><p style="color:red">'+CONVERT(VARCHAR(10),wo.DueDate,101)+N'</p></td>' 
         +N'<td><p style="color:red">'+STR((p.ListPrice - p.StandardCost) * wo.OrderQty)+N'</p></td>' 
     FROM AdventureWorks.Production.WorkOrder as wo 
     JOIN AdventureWorks.Production.Product AS p 
     ON wo.ProductID = p.ProductID 
     WHERE DueDate > '2004-04-30' 
     AND DATEDIFF(dd, '2004-04-30', DueDate) < 2 
     --AND Rating = 'Bad' 

) 

SELECT @Data=(SELECT HTMLRows 
       FROM (
     SELECT N'<tr>'+HTMLRowData+N'</tr>' AS HTMLRows FROM CTE_Good 
     UNION SELECT N'<tr>'+HTMLRowData+N'</tr>' AS HTMLRows FROM CTE_Bad 
     ) mi    
    FOR XML PATH(''), TYPE 
     ).value('/', 'NVARCHAR(MAX)') 

    SET @[email protected][email protected]+N'</table>' 

--SELECT @tableHTML 

EXEC msdb.dbo.sp_send_dbmail @recipients='[email protected]', 
@subject = 'Work Order List', 
@body = @tableHTML, 
@body_format = 'HTML' ; 
+0

Я знаю, этот вопрос не был активным в течение 5 лет, но если бы я хотел добавить 'ORDER BY' к конечному результату, где я должен добавить его? Переменная '@ Data' не имеет каких-либо знаний о столбцах в CTE. 'HTMLRowData' - это только одна длинная строка. Я хочу заказать по столбцу, например 'ProductID'. Любая помощь будет оценена по достоинству. –