Sql server T-sql,同时循环创建电子邮件的html代码。如何在此循环中动态更改表名和变量名?

Sql server T-sql,同时循环创建电子邮件的html代码。如何在此循环中动态更改表名和变量名?,sql-server,tsql,stored-procedures,html-email,dynamic-sql,Sql Server,Tsql,Stored Procedures,Html Email,Dynamic Sql,我正在尝试在sql server中创建电子邮件系统。这封邮件有很多细节。我需要3到无限表在这封电子邮件。 我还需要每个表上方的标题 我的问题是在循环中创建xml代码,同时更改表名和变量 dbo.additional_info1 dbo.additional_info2 dbo.additional_info3 @var1 @var2 @var3 这些表都是从sql中的不同表创建的,让我们调用这个表 dbo.additional_info因为有多个摘要,所以有多个表 所以有dbo.additio

我正在尝试在sql server中创建电子邮件系统。这封邮件有很多细节。我需要3到无限表在这封电子邮件。 我还需要每个表上方的标题

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

dbo.additional_info1
dbo.additional_info2
dbo.additional_info3
@var1
@var2
@var3
这些表都是从sql中的不同表创建的,让我们调用这个表 dbo.additional_info因为有多个摘要,所以有多个表 所以有dbo.additional_info1 dbo.additional_info2等等

对于这个例子,假设我有3个表和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>
'
上面的代码可以工作,但我希望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 Server不支持宏替换,因此会留下动态SQL或一些小漏洞,如下所示

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

范例


澄清一下,在你的帖子里

从dbo.Additional_info1到2再到3

这是你想要动态的部分吗,从表1,然后是表2,然后是表3? 如果是,试试这个。 请注意,我并没有构建要重新创建的表,但它应该是关闭的。如果不行就告诉我!诀窍是,你必须为你想调用的每个变量构建全文字符串,然后像调用函数一样调用该变量。当我测试这些时,我打印变量print@DynamicSqlHere;在尝试执行exec@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) 

您已经标记了动态SQL,但是,我在这里看不到任何动态内容。我也怀疑你需要一段时间。表中的数据是什么样子的?你想要的最终结果是什么?@Larnu我之所以标记dynamic是因为我认为使用dynamic方法是一种可能的解决方案,但我还没有用这种方法解决它。我确实需要使用while循环,但是如果你有一个更有效的想法,我很乐意听到。
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)