My Query looks like this DECLARE @tableHTML NVARCHAR(MAX), @MailSubject VARCHAR(100) SELECT @MailSubject = 'QueryResults as on '+ CONVERT(VARCHAR(20), GETDATE(), 100) SET @tableHTML = N'<H1>QueryResults</H1>' + N'<table border="1">' + N'<tr><th>ID</th>' + N'<th>Name</th>' + N'<th>Date</th>' + N'<th>Value</th>' + N'<th>createdby</th></tr>' + CAST ( ( SELECT td = ISNULL(T.ID,'NULL'), '', td = ISNULL(T.Name,'NULL'), '', td = ISNULL(CONVERT(VARCHAR(20),T.Date, 100),'NULL'), '', td = ISNULL(T1.Value,'NULL'), '', td = ISNULL(T2.createdby,'NULL'), '' FROM dbo.Test T INNER JOIN dbo.Test1 T1 ON T.AID = T1.BID INNER JOIN dbo.Test2 T2 ON T.TDID = T2.TDID WHERE T2.MinID = 5 AND T2.GPID = 12 AND T1.LID = 8 ORDER BY 1 FOR XML PATH('tr'), TYPE ) AS NVARCHAR(MAX) ) + N'</table>' ; -- To get Column Header when no values are returned by the query SELECT @tableHTML = ISNULL(@tableHTML,'<H1>QueryResults</H1><table border="1"><tr><th>ID</th><th>Name</th><th>Date</th><th>Value</th><th>createdby</th></tr>') EXEC msdb.dbo.sp_send_dbmail @recipients='xyz@gmail.com', --recipients email list @subject = @MailSubject, @profile_name = 'MyMailProfile', @body = @tableHTML, @body_format = 'HTML' ;Here @tableHTML is not able to hold all values in the result set returned by the query.