返回 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
值。 NULL
s 被省略,将导致 shifted 损坏 table 布局...
顺便说一句:在 this answer 中有一个函数,可以直接从任何查询中创建丰富的 HTML-table...可能会有帮助..
我们正在清理共享电子邮件地址的帐户数据库。 一些电子邮件地址用于多达 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
值。 NULL
s 被省略,将导致 shifted 损坏 table 布局...
顺便说一句:在 this answer 中有一个函数,可以直接从任何查询中创建丰富的 HTML-table...可能会有帮助..