Sql 子查询错误,不允许返回超过1个值

Sql 子查询错误,不允许返回超过1个值,sql,sql-server-2008,Sql,Sql Server 2008,在我的数据库中,我有一个名为studentEmailAddresses的表,我想获取每个电子邮件地址,并创建一个长字符串来保存所有电子邮件地址,以便可以在我的sp\u send\u dbmail函数中使用 例如,我有两个电子邮件地址Test1@hotmail.com和Test2@hotmail.com所以在子查询的末尾,我想要一个类似于Test1@hotmail.com; Test2@hotmail.com;。下面显示了我是如何尝试执行此操作的,但我收到以下错误消息子查询返回的值超过1。当子查询

在我的数据库中,我有一个名为
studentEmailAddresses
的表,我想获取每个电子邮件地址,并创建一个长字符串来保存所有电子邮件地址,以便可以在我的
sp\u send\u dbmail
函数中使用

例如,我有两个电子邮件地址
Test1@hotmail.com
Test2@hotmail.com
所以在子查询的末尾,我想要一个类似于
Test1@hotmail.com; Test2@hotmail.com;。下面显示了我是如何尝试执行此操作的,但我收到以下错误消息
子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时。

Declare @emailList varchar (1000)
set @emailList = (Select coalesce(emailAdd + ';', ' ') 
from studentEmailAddresses)
Print @emailList 
试试这个:

Declare @emailList varchar (1000) = ''
Select @emailList += coalesce(emailAdd + ';', ' ') 
from studentEmailAddresses
Print @emailList
试试这个:

Declare @emailList varchar (1000) = ''
Select @emailList += coalesce(emailAdd + ';', ' ') 
from studentEmailAddresses
Print @emailList

错误是因为您正在使用
SET
进行变量赋值。从查询赋值时,SET只能赋值一个标量值。如果查询返回多个值/行,那么SET将引发错误(这里就是这种情况)
SELECT
将为变量指定一个值,并隐藏返回多个值的事实(因此您可能永远不知道其他地方出错的原因)。您可以将查询编写为:

Declare @emailList varchar (1000)
SET  @emailList  = 
(select emailAdd+ ';' AS 'data()'
FROM @studentEmailAddresses 
FOR XML PATH('')  )

错误是因为您正在使用
SET
进行变量赋值。从查询赋值时,SET只能赋值一个标量值。如果查询返回多个值/行,那么SET将引发错误(这里就是这种情况)
SELECT
将为变量指定一个值,并隐藏返回多个值的事实(因此您可能永远不知道其他地方出错的原因)。您可以将查询编写为:

Declare @emailList varchar (1000)
SET  @emailList  = 
(select emailAdd+ ';' AS 'data()'
FROM @studentEmailAddresses 
FOR XML PATH('')  )

在SQL Server中:

Declare @emailList varchar (1000)
SET @emailList=''
Select @emailList = @emailList +  coalesce(emailAdd + ';', ' ') 
from studentEmailAddresses
Print @emailList
DECLARE emailList VARCHAR(1000);
SET emailList='';
SELECT CONCAT(emailList, emailAdd, '; ') INTO  emailList
FROM studentEmailAddresses;
SELECT emailList FROM DUAL;
在MySQL中:

Declare @emailList varchar (1000)
SET @emailList=''
Select @emailList = @emailList +  coalesce(emailAdd + ';', ' ') 
from studentEmailAddresses
Print @emailList
DECLARE emailList VARCHAR(1000);
SET emailList='';
SELECT CONCAT(emailList, emailAdd, '; ') INTO  emailList
FROM studentEmailAddresses;
SELECT emailList FROM DUAL;
注意,DUAL在MySQL中是一个虚拟表,或者您可以简单地选择emailList作为

SELECT emailList;

谢谢。

在SQL Server中:

Declare @emailList varchar (1000)
SET @emailList=''
Select @emailList = @emailList +  coalesce(emailAdd + ';', ' ') 
from studentEmailAddresses
Print @emailList
DECLARE emailList VARCHAR(1000);
SET emailList='';
SELECT CONCAT(emailList, emailAdd, '; ') INTO  emailList
FROM studentEmailAddresses;
SELECT emailList FROM DUAL;
在MySQL中:

Declare @emailList varchar (1000)
SET @emailList=''
Select @emailList = @emailList +  coalesce(emailAdd + ';', ' ') 
from studentEmailAddresses
Print @emailList
DECLARE emailList VARCHAR(1000);
SET emailList='';
SELECT CONCAT(emailList, emailAdd, '; ') INTO  emailList
FROM studentEmailAddresses;
SELECT emailList FROM DUAL;
注意,DUAL在MySQL中是一个虚拟表,或者您可以简单地选择emailList作为

SELECT emailList;

谢谢。

打印状态没有返回结果,这可能是因为de@emailList默认为空。我编辑得很好!如果答案解决了您的问题,请接受答案。可能是因为de@emailList默认为空,所以打印状态不会返回任何结果。我编辑得很好!如果它解决了你的问题,请接受答案