用于传递表变量的表值参数之外的选项?

时间:2017-04-28 14:00:35

标签: sql-server sql-server-2008 tsql

我们有许多用于报告的存储过程。所有这些程序都遵循以下格式。本质上,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。

还有其他选择吗?

感谢。

1 个答案:

答案 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