0

我们正在清理共享电子邮件地址的帐户数据库。一些电子邮件地址用于多达 20 个帐户,但我们正在迁移到不允许这样做的新系统。

我在这里要做的是创建一个电子邮件地址列表,计算它们的使用次数以及第三列,其中包含一个包含帐户详细信息的 HTML 表。这些表格将通过电子邮件发送到相关地址,要求他们修复帐户。

就其本身而言,该功能可以正常工作:

SELECT MembershipNumber td, Username td, FirstName td, Lastname td, Telephone td, Mobile td 
FROM [dbo].[DuplicateEmailAccounts] ('someone@example.com')
FOR XML RAW('tr'), ELEMENTS, ROOT('table')

这将生成一个 XML 响应,其中包含一个列出所有关联帐户的 HTML 表。到目前为止一切都很好。

当我尝试将其加入电子邮件地址列表时,问题就开始了 - 最终输出将是一个 CSV 文件,上传到 mailchimp 以执行邮件合并操作。当我在更大的 SQL 语句中包含该函数时,我收到错误:

消息 8155,级别 16,状态 2,第 26 行没有为“帐户”的第 1 列指定列名称。

任何有关如何解决此问题的建议将不胜感激!

select m.E_mail, count(*) MemberCount, accounts.*
    from Members m
CROSS APPLY (
(SELECT MembershipNumber td, Username td, FirstName td, 
    Lastname td, Telephone td, Mobile td 
    FROM [dbo].[DuplicateEmailAccounts] (E_mail)
    FOR XML RAW('tr'), ELEMENTS, ROOT('table')) ) accounts
where m.E_mail is not null and dbo.trim(m.E_mail) <> ''
    group by m.e_mail
    having count(*) > 1
    order by count(*) desc
4

1 回答 1

2

我无法用您的表重现这一点,因此一个示例对任何 SQL-Server 数据库中存在的表使用了一些虚拟查询。尝试一下并根据您的需要调整您的查询:

SELECT TOP 3 o.*
            ,accounts.*
FROM sys.objects o
CROSS APPLY
(
    (SELECT TOP 3 t.create_date td, t.durability_desc td FROM sys.tables t FOR XML RAW('tr'),ELEMENTS,ROOT('table'))
) accounts(x)

提示:如果需要,您可以在后面添加,TYPEROOT()获取类型化的 XML。

提示 2:确保NULL结果集中没有值。NULLs 被省略,会导致表格布局发生偏移...

顺便说一句:在这个答案中有一个函数,它可以直接从任何查询中创建一个丰富的 HTML 表......可能会有所帮助......

于 2018-11-29T16:26:32.700 回答