SQL错误-如果没有使用EXISTS引入子查询,则只能在选择列表中指定一个表达式



我正在尝试创建一个脚本/SP来从表中提取数据,并用电子邮件中包含的数据以HTML格式发送电子邮件。我写了以下内容,但得到了上面的错误,但不完全确定在哪里"修复"子查询。目前的查询是:声明@tableHTML NVARCHAR(最大值);

SET @tableHTML =
N'<H1>Ad Groups and Users</H1>' +
N'<table border="1">' +
N'<tr><th>AD Group Name</th><th>Number of Users</th>' +
CAST    ( 
(SELECT        Group_Name,
COUNT(*) AS 'Number of Users'
FROM        TABLE
WHERE       Group_Name IN   (
'PA_OptiTime',
'PA_P6',
'PA65_BIW',
'PA65_CAFM',
'PA65_CoinsOA',
'PA65_ConquestQ',
'PA65_Desktop_Osborne',
'PA65_MicrosoftAccess',
'PA65_MicrosoftOfficeStandard',
'PA65_MicrosoftOneNote',
'PA65_MicrosoftProject',
'PA65_MicrosoftVisio',
'PA65_MicrosoftVisioViewer',
'PA65_XStandard',
'SA65_AdobeCSSuite',
'SA65_AdobeProfessional',
'SA65_AdobeReader',
'SA65_AdobeStandard',
'SA65_AstaPowerproject',
'SA65_BentleyProjectwise',
'SA65_BravaReader',
'SA65_BravaViewer',
'SA65_CoinsPlus',
'SA65_GemSafe',
'SA65_GoogleEarth',
'SA65_NavisworksFreedomViewer',
'SA65_NRG',
'SA65_Offline',
'SA65_PDFEditor',
'SA65_PolycomCMADesktop',
'SA65_PrimaveraP6',
'SA65_SelectHR',
'SA65_ShareRegister',
'SA65_SketchUp',
'SA65_Xpress3DViewer'
)
GROUP BY Group_Name
) 
AS NVARCHAR(MAX) 
) +
N'</table>' ;
--create full body text
DECLARE @BodyText varchar(255)
DECLARE @SubjectText varchar(255)
SELECT @SubjectText = 'Test Email'
SELECT @BodyText = @tableHTML 
--send message
EXEC EXSP_SendSMTPMailCDO 
@To='email@work.com', 
@Subject = @SubjectText,
@Body = @BodyText,
--@HTMLFormat = 0,
@body_format = 'HTML',
@From = 'email@work.com',
@Server = 'smtprelay'
Any help would be appreciated.
Thank you

您正试图强制转换一个子查询,该子查询将两列返回到NVARCHAR。SqlServer不会理解如何将两列聚合到一个文本字段中,并且会抛出您收到的错误。

CAST    ((SELECT Group_Name,
COUNT(*) AS 'Number of Users'
FROM        TABLE
WHERE       Group_Name IN   (
'PA_OptiTime'                                                    
)
GROUP BY Group_Name
) AS NVARCHAR(MAX) 

编辑:即使减少子查询以返回一列也不起作用。问题是,看起来您正试图为每个组附加一行XML。因此,虽然最初的错误是通过尝试在SQL中强制转换多列而产生的,但修复该问题不会产生为每个组附加一行XML的查询。

最新更新