4 votes

Y a-t-il une autre façon d'écrire cette requête ?( J'obtiens "Subquery returned more than 1 value error".

Je suis en train de créer une fonction où je dois passer plusieurs identifiants (supposons A.id) (int) séparés par des virgules comme (2,3) et le résultat sera les valeurs (int) liées à ces identifiants. Supposons que si je passe (2,3) le résultat devrait être comme (8,9,7,5).

declare @roleid varchar(max)  
set @roleid=(select mr.Id from M_Organization mo
join m_role mr on mr.Id=mo.RoleId 
cross apply STRING_SPLIT ('3,4', ',') cs WHERE mo.Id IN (cs.value)
)
select @roleid

Il affiche l'erreur suivante :

La sous-requête a retourné plus d'une valeur. Ceci n'est pas autorisé lorsque la requête sous-requête suit =, !=, <, <= , >, >= ou lorsque la sous-requête est utilisée comme une expression.

1voto

Mano Points 735

Vous pouvez utiliser le TOP 1 dans la requête. Parce que vous attribuez une valeur à la variable et qu'elle ne prend qu'une seule valeur de retour de la requête.

declare @roleid varchar(max)  
set @roleid=(select TOP 1 mr.Id from M_Organization mo
join m_role mr on mr.Id=mo.RoleId 
cross apply STRING_SPLIT ('3,4', ',') cs WHERE mo.Id IN (cs.value)
)
select @roleid

1voto

Suraj Kumar Points 3028

Vous pouvez essayer ceci

declare @roleid varchar(max)  
set @roleid=(select top 1 mr.Id from M_Organization mo
join m_role mr on mr.Id=mo.RoleId 
cross apply STRING_SPLIT ('3,4', ',') cs WHERE mo.Id IN (cs.value)
)
select @roleid

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X