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:
WITH (NOLOCK)
est déprécié. changez l'isolation de connection en READ UNCOMMITTED ou SNAPSHOT à la place.