首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重写sql语句?

如何重写sql语句?
EN

Stack Overflow用户
提问于 2021-09-11 11:07:39
回答 1查看 53关注 0票数 0

我有一个sql语句,用于发送邮件。输出如下所示。

代码语言:javascript
复制
    select 'mail body content-1' as 'mailBody','11/9/221' as 'mailFooter','a@a.com' as 'mail'
    union all
    select 'mail body content-2' as 'mailBody','11/09/2021' as 'mailFooter','b@b.com' as 'mail'
    union all
    select 'mail body content-3' as 'mailBody','10/09/2021' as 'mailFooter','a@a.com' as 'mail'

在这里,我通过"group“为每个邮件发送邮件,并将数据与"xml”相结合。

我的完整代码如下

代码语言:javascript
复制
DECLARE @mail varchar(255)=''
DECLARE @mailBody nvarchar(max)=''
DECLARE db_cursor CURSOR FOR

    select m.mail from (
        --sql String
        select 'mail body content-1' as 'mailBody','11/9/221' as 'mailFooter','a@a.com' as 'mail'
        union all
        select 'mail body content-2' as 'mailBody','11/09/2021' as 'mailFooter','b@b.com' as 'mail'
        union all
        select 'mail body content-3' as 'mailBody','10/09/2021' as 'mailFooter','a@a.com' as 'mail'
        --sql String/
    ) m group by m.mail

---------------------------------------------------------------------------------------------------------------------------- Mail Cursor
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO  @mail

WHILE @@FETCH_STATUS = 0  
BEGIN



set @mailBody=(select c.mailBody as 'span',c.mailFooter as 'small' from (
        --sql String
        select 'mail body content-1' as 'mailBody','11/9/221' as 'mailFooter','a@a.com' as 'mail'
        union all
        select 'mail body content-2' as 'mailBody','11/09/2021' as 'mailFooter','b@b.com' as 'mail'
        union all
        select 'mail body content-3' as 'mailBody','10/09/2021' as 'mailFooter','a@a.com' as 'mail'
        --sql String/
) c where c.mail=@mail
for XML PATH ('div')
)
    select  @mail,@mailBody
    --EXEC msdb.dbo.sp_send_dbmail


FETCH NEXT FROM db_cursor INTO @mail
END

CLOSE db_cursor
---------------------------------------------------------------------------------------------------------------------------- Mail Cursor/

DEALLOCATE db_cursor 

因此,它给了我以下输出。

我在这里的问题是,我必须写同样的"sql字符串“句子2次。

  1. 分组为
  2. 以在"for路径“

中使用

我怎么才能摆脱这种复发呢?

"sql字符串“不断变化。但是在每个sql语句中都有一个名为"mail“的字段。我计划把它作为一个程序来保存,并一直使用它。

我的路是正确的吗?

我正在使用Server 2016。

我还没有决定如何处理String,有条件的“为什么”循环,sp_execute,插入@tempTable。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-13 20:17:47

可以使用with块为循环生成xml路径:

代码语言:javascript
复制
DECLARE @mail varchar(255)=''
DECLARE @mailBody nvarchar(max)='';
DECLARE db_cursor CURSOR FOR

    with tmp as (
        --sql String
        select 'mail body content-1' as 'mailBody','11/9/221' as 'mailFooter','a@a.com' as 'mail'
        union all
        select 'mail body content-2' as 'mailBody','11/09/2021' as 'mailFooter','b@b.com' as 'mail'
        union all
        select 'mail body content-3' as 'mailBody','10/09/2021' as 'mailFooter','a@a.com' as 'mail'
        --sql String/
    )
    select m.mail, (select c.mailBody as 'span',c.mailFooter as 'small' from tmp c where c.mail=m.mail for XML PATH ('div'))
    from tmp m group by m.mail;

---------------------------------------------------------------------------------------------------------------------------- Mail Cursor
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO  @mail, @mailBody

WHILE @@FETCH_STATUS = 0  
BEGIN

    select  @mail,@mailBody
    --EXEC msdb.dbo.sp_send_dbmail

FETCH NEXT FROM db_cursor INTO @mail, @mailBody
END

CLOSE db_cursor
---------------------------------------------------------------------------------------------------------------------------- Mail Cursor/

DEALLOCATE db_cursor 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69142391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档