返回 XML 的交叉应用函数需要列名

Cross apply function returning XML needs a column name

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

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

函数本身可以正常工作:

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 table 列出了所有关联的帐户。目前一切顺利。

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

Msg 8155, Level 16, State 2, Line 26 No column name was specified for column 1 of 'accounts'.

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

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

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

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)

提示:如果需要,您可以在 ROOT() 之后添加 ,TYPE 以获得键入的 XML。

提示 2:确保结果集中没有 NULL 值。 NULLs 被省略,将导致 shifted 损坏 table 布局...

顺便说一句:在 this answer 中有一个函数,可以直接从任何查询中创建丰富的 HTML-table...可能会有帮助..