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)
我正在尝试在 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)