【问题标题】:Options besides table valued parameters for passing table variable?除了用于传递表变量的表值参数之外的选项?
【发布时间】:2017-04-28 22:41:13
【问题描述】:

我们有许多用于报告的存储过程。所有这些程序都遵循以下格式。本质上,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_GetComplexData 调用usp_sendHtmlReportViaEmail,方法是发送@MyTable 作为参数。我正在阅读有关table valued parameters 的信息,但这需要为我将通过的每个表创建一个 TVP。我不想为将传递给usp_sendHtmlReportViaEmail 的每个表创建一个特定的 TVP。

还有其他选择吗?

谢谢。

【问题讨论】:

  • 在 SSRS 中,您可以将报告导出为 html 或 mhtml(带有嵌入图像)。考虑选择 SSRS 来生成报告,而不是自己做这项工作
  • 我考虑过,但考虑到它需要成为一个固定的工作,我认为这会更困难。这些报告按计划发送(即每小时)。
  • 在我公司,我们经常以您提供的方式发送表格。如果您不想使用任何报告服务,这是最好的方法
  • @MikhailLobanov,你是说不要使用 SSRS?
  • 不,SSRS 更适合报告。有一天,您将希望发送复杂的报告,其中一些将使用 SSRS 发送,而另一些则使用sp_send_dbmail 程序发送。这样不好。但是您问的是在没有 SSRS 的情况下发送报告,而您的查询对此很有用

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


【解决方案1】:

如果您决定使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多