Je reçois ce message lorsque j'utilise le cas et je ne veux pas avoir d'expression vérifiant si l'identifiant est vide ou non, ce serait du code supplémentaire inutile.
La sous-requête a renvoyé plus d'une valeur. Cela n'est pas autorisé lorsque la sous-requête suit =,! =, <, <=,>,> = Ou lorsque la sous-requête est utilisée comme une expression.
declare @idchar(2) set @id= '' select names from Units where id in( case @id when '' then (select id from Units) else @id end )
Vous pouvez réécrire votre requête comme suit:
select names from Units where (@id = '' AND id in(select id from Units)) OR id = @id
Dans ce cas, si @id
est ''
alors l' id in(select id from Units)
condition id in(select id from Units)
est évalué. Si toutefois @id
a une autre valeur, alors la condition id = @id
est évaluée. Cela suppose que @id
ne peut pas avoir de valeur NULL
.
EDIT: Après avoir regardé la requête, il semble que la requête peut être beaucoup simplifiée. Vous n'avez pas du tout besoin d'une partie IN
, car vous essayez d'accéder à tous les loggings de la même table, vous pouvez donc utiliser une requête encore plus simple:
select names from Units where @id = '' OR id = @id
En supposant que vous n'avez jamais à faire face à des nulls, cela le ferait:
SELECT names from Units where (id = @Id or (isnull(@Id, '') = ''))