我试图在sql server中创建一个邮件系统。这个邮件有很多细节。我需要在这封邮件中建立3个到无穷大的表。我还需要在每个表的上方设置表头。
我的问题是在循环中创建xml代码,同时改变表名和变量。
这些表都是在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>
'
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)
上面的代码是可行的,但是我希望每次@Sp递增时,表名和@var都能调整。 我想代码应该像下面这样。我试过下面的代码,加上100种不同的方法,但都没有用。
有什么建议吗?我对htmlxml一点都不熟悉,我真的很努力,但不知道该从哪里下手。
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
例子
...
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
...
澄清一下,在你的帖子中,你有
FROM dbo.Additional_info1 --- 然后是2然后是3
这是你想要动态的部分,你从表1,然后2,然后3拉?如果是,试试这个.注意,我没有建立表来重新创建,但它应该是接近的。如果不成功,请告诉我! 诀窍是,你必须为每一个你想调用的东西建立完整的文本字符串到一个变量中,然后像调用一个函数一样调用这个变量。当我测试这些的时候,我在尝试执行(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)