T-sql While 循环为电子邮件创建 html 代码。如何在此循环中动态更改 table 名称和变量名称?

T-sql While loop creating html code for an email. How do I dynamically change the table name and variable name in this loop?

我正在尝试在 sql 服务器中创建一个电子邮件系统。这封电子邮件有很多细节。在这封电子邮件中我需要 3 到无穷大 tables。 我还需要每个 table 以上的 headers。

我的问题是在循环中创建 xml 代码,同时更改 table 名称和变量。

table 都是从 sql 中的不同 table 创建的,让我们称之为 table "dbo.additional_info" 因为有多个摘要所以有多个 tables 于是就有了 dbo.additional_info1 dbo.additional_info2 等等。

对于这个例子,假设我有 3 个 table 和 3 个变量。

dbo.additional_info1
dbo.additional_info2
dbo.additional_info3
@var1
@var2
@var3

这是我构建的代码:

DECLARE @SP tinyint  -- start point 
DECLARE @EP tinyint  -- end point 
DECLARE @body NVARCHAR(MAX)
DECLARE @xml2 NVARCHAR(MAX)
declare @var1 varchar(10)
declare @var2 nvarchar(10)  
declare @var3 nvarchar(10)  


set @var1 = 'James'; 
set @var2  = 'Jess'; 
set @var3 = 'Henry'
set @EP = 3
set @SP = 1

SET @body = '
<table border = 1> 
<tr>
<th> Last Name </th> </tr>
'


set @xml2 = ''

while (@SP < @EP) 
begin 


 set @xml2 =  @xml2 + 
(case when @var1 in  (select name from dbo.names)   
then  '<H3>Info' + convert(varchar,@SP) + (select Location from dbo.names where name = @var1)+ ' Summary</H3>' 
else '<H3>Info' + convert(varchar,@SP) + @var1 + 'Not available </H3>'  end) +
 @body +
 Convert(nvarchar(max), (SELECT
                 [details] as [td], ''

          FROM  dbo.Additional_info1 --- then 2 then 3 
          Order by  [Age]
       For XML path('tr'), Type))
    +'</table>' 
set @sp+=1;


end 

print(@xml2) 

上面的代码有效,但我希望 tablename 和 @var 在每次 @Sp 递增时进行调整。我认为代码应该如下所示: 我已经尝试了下面的代码加上 100 种不同的东西,但没有骰子。

有什么建议吗?我根本不熟悉 html/xml,我真的很努力,但不知道从这里去哪里。



 set @xml2 =  @xml2 + 
(case when  concat(@var,  convert(varchar,@SP)) in  (select name from dbo.names)   
then  '<H3>Info' + convert(varchar,@SP) + (select Location from dbo.names where name =  concat((@var or '@var'?),  convert(varchar,@SP)))+ ' Summary</H3>' 
else '<H3>Info' + convert(varchar,@SP) + @var1 + 'Not available </H3>'  end) +
 @body +
 Convert(nvarchar(max), (SELECT
                 [details] as [td], ''

            FROM  concat(dbo.additional_info,  convert(varchar,@SP))

          Order by  [Age]
       For XML path('tr'), Type))
    +'</table>' 
set @sp+=1;


end 

print(@xml2) 

I want the email to look like this: 

Info 1:  Location: America -- this is for @var1 
Table with a few rows of "details." 

SQL 服务器不支持宏替换,因此会留下动态 SQL 或如下所示的一些 hack。

这还假设您的表具有相同的结构,您可以定义一个变量 @GetTable

例子

...
FROM ( Select * From dbo.Additional_info1 Where @GetTable=1
       Union All
       Select * From dbo.Additional_info2 Where @GetTable=2
       Union All
       Select * From dbo.Additional_info3 Where @GetTable=3
     ) SrcData
...

澄清一下,在您的 post 中您有

FROM dbo.Additional_info1 --- then 2 then 3

这是你想要动态的部分吗,你从 table 1,然后 2,然后 3 中拉出来? 如果是,试试这个。 请注意,我没有构建 tables 来重新创建,但它应该是接近的。如果它不起作用,请告诉我!诀窍是您必须为每个要调用的变量构建完整的文本字符串,然后调用该变量,就好像它是一个函数一样。当我测试这些时,我在尝试执行 (exec (@DynamicSqlHere);) 之前打印变量 (print (@DynamicSqlHere);)。如果您可以复制并粘贴打印输出,那么该输出会提供您所期望的,那么您就拥有了您所需要的。

DECLARE @SP tinyint  -- start point 
DECLARE @EP tinyint  -- end point 
DECLARE @body NVARCHAR(MAX)
DECLARE @xml2 NVARCHAR(MAX)
declare @var1 varchar(10)
declare @var2 nvarchar(10)  
declare @var3 nvarchar(10)  


set @var1 = 'James'; 
set @var2  = 'Jess'; 
set @var3 = 'Henry'
set @EP = 3
set @SP = 1

SET @body = '
<table border = 1> 
<tr>
<th> Last Name </th> </tr>
'


set @xml2 = ''


while (@SP < @EP) 
begin 

declare @Location nvarchar(200) = (select Location from dbo.names where name = @var1)
declare @DynamicTableCallHere nvarchar(2000) = ''
declare @Message nvarchar(max) =    (case   
                                    when @Location is not null then '<H3>Info' + convert(varchar,@SP) + @Location + ' Summary</H3>' 
                                    when @Location is null then '<H3>Info' + convert(varchar,@SP) + @var1 + 'Not available </H3>' 
                                    end
                                    )

declare @DynamicSqlHere nvarchar(max) = 'set @DynamicTableCallHere = (Convert(nvarchar(max), (SELECT [details] as [td], '''' FROM  dbo.Additional_info' + @sp + ' Order by  [Age] For XML path(''tr''), Type)))'
exec (@DynamicSqlHere);

set @xml2 = @xml2 +
+ @Message
+ @body
+ @DynamicTableCallHere
+ '</table>';

set @sp+=1;


end 

print(@xml2)