我们有许多用于报告的存储过程。所有这些程序都遵循以下格式。本质上,SP确实有效,最终结果插入到@table变量中:
ALTER procedure dbo.usp_GetComplexData
as
declare @MyTable table
(
Col1 varchar(20),
Col2 varchar(20)
)
-- Here the SP is doing lots of work with lots of tables.
-- The result inserted in @MyTable
SELECT Col1, Col2 from @MyTable
现在我需要通过电子邮件(以html格式)发送这些存储过程的结果。
我还有SpCustomTable2HTML
(找到at Symantec)将任何表转换为html表。它不需要表模式来完成它的工作;它只需要获取表并返回一个html表。
所以这是存储过程:
ALTER procedure usp_sendHtmlReportViaEmail
as
DECLARE @HTML1 NVARCHAR(MAX)
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
drop TABLE #results
select top 50 * into #results From MyTable
EXEC SpCustomTable2HTML '#results', @HTML1 OUTPUT, '', ''
EXEC sp_send_dbmail @profile_name='My profile',
@recipients='test@Example.com',
@subject='Test message',
@body_format = 'HTML',
@body=@HTML1
我想通过发送usp_sendHtmlReportViaEmail
作为参数以某种方式从usp_GetComplexData
致电@MyTable
。我正在阅读有关table valued parameters的内容,但这需要为每张桌子创建一个TVP。我不想为将传递给usp_sendHtmlReportViaEmail
的每个表创建特定的TVP。
还有其他选择吗?
感谢。
答案 0 :(得分:0)
如果您决定使用SQL,那么您应该考虑使用global temporary table。您必须确保在执行代码后进行清理以避免使用太多资源,但这可能是一种有效的方法。
在usp_GetComplexData
程序结束时,只需将数据插入##TemporaryTable
,然后将其用作usp_sendHtmlReportViaEmail
的参数。由于我不知道你对table变量做了什么,我不会替换它,但你可能会用临时表替换它。
ALTER PROCEDURE usp_GetComplexData
AS BEGIN
DECLARE @MyTable TABLE
(/*... Columns ...*/);
-- Do complex data stuff...
SELECT
*
INTO
##MyTempTable
FROM
@MyTable;
EXECUTE usp_sendHtmlReportViaEmail '##MyTempTable';
SELECT
*
FROM
@MyTable;
END