T-SQL ERROR – La sous-requête a renvoyé plus de 1 valeur

J'obtiens l'erreur suivante dans SQL Server:

Msg 512, niveau 16, état 1, ligne 18 sous-requête a renvoyé plus de 1 valeur. Ceci n'est pas autorisé lorsque la sous-requête suit =,! =, <, <=,>>,> = Ou lorsque la sous-requête est utilisée comme une expression.

Mon code est le suivant:

DECLARE @personNumber varchar(20), @itemNumber varchar(20) SET @personNumber = 'null' SET @itemNumber = 'null' SELECT OU.UserID ,OU.Name ,IGWQ.itemNumber ,IG.itemName ,IGWQ.QuantityOnHand FROM dbo.Table1 IGWQ INNER JOIN Table2 OU ON IGWQ.UserId = OU.UserId INNER JOIN Table3 IG ON IGWQ.itemNumber = IG.itemNumber WHERE IGWQ.userid IN (CASE WHEN @personNumber = 'null' THEN ( SELECT DISTINCT UserID FROM Table2 WITH(NOLOCK) WHERE [Role] = '01') ELSE @personNumber END) AND IGWQ.itemNumber IN (CASE WHEN @itemNumber = 'null' THEN ( SELECT DISTINCT itemNumber FROM dbo.Table1 WITH(NOLOCK)) ELSE @itemNumber END) 

Quelqu'un peut-il suggérer une solution à ce problème? Je pensais que l'utilisation de 'IN' aurait réglé le problème.

utilisez ceci pour réparer le rest:

 WHERE ((@personNumber <> 'null' AND @personNumber = IGWQ.userid) OR (@personNumber = 'null' AND IGWQ.userid IN ( SELECT UserID FROM Table2 WITH(NOLOCK) WHERE [Role] = '01') )) 

Vous n'avez pas besoin de DISTINCT car l'instruction IN ne gère que des valeurs distinctes.

 WHERE (IGWQ.userid = @personNumber OR @personNumber = 'NULL' and EXISTS (SELECT * FROM Table2 t WITH (NOLOCK) WHERE t.[Role] = '01' AND t.UserID = IGWQ.userid) ) AND (IGWQ.itemNumber = @itemNumber OR @itemNumber = 'NULL' and EXISTS (SELECT * FROM dbo.Table1 t WITH (NOLOCK) WHERE t.itemNumber = IGWQ.itemNumber) ) 

Remarques:

  1. CASE renvoie un scalaire, il ne peut renvoyer une sous-requête (c'est-à-dire définir).
  2. WITH (NOLOCK) est déprécié. changez l'isolation de connection en READ UNCOMMITTED ou SNAPSHOT à la place.