Sql server T-sql,同时循环创建电子邮件的html代码。如何在此循环中动态更改表名和变量名?
我正在尝试在sql server中创建电子邮件系统。这封邮件有很多细节。我需要3到无限表在这封电子邮件。 我还需要每个表上方的标题 我的问题是在循环中创建xml代码,同时更改表名和变量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
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)