0

I have a table like this

CREATE TABLE [dbo].[TEST_FIND]
(
    [UNIT1] [nvarchar](50) NULL,
    [UNIT2] [nvarchar](50) NULL,
    [UNIT3] [nvarchar](50) NULL,
    [UNIT4] [nvarchar](50) NULL
) ON [PRIMARY]

and data in that table looks like this

UNIT1 | UNIT2 | UNIT3 | UNIT4
a     | b     | c     | d
null  | b     | null  | null
null  | null  | c     | null
null  | null  | null  | d
a     | null  | null  | null

and my stored procedure is:

CREATE PROCEDURE [dbo].[A_TEST]
    @UNIT1 nvarchar(50) = NULL,
    @UNIT2 nvarchar(50) = NULL,
    @UNIT3 nvarchar(50) = NULL,
    @UNIT4 nvarchar(50) = NULL
AS
BEGIN
    SELECT
        UNIT1, UNIT2, UNIT3, UNIT4
    FROM
       TEST_FIND
    WHERE
       @UNIT1 is null or UNIT1 like '%'+@UNIT1+ '%' AND
       @UNIT2 is null or UNIT2 like '%'+@UNIT2+ '%' AND
       @UNIT3 is null or UNIT3 like '%'+@UNIT3+ '%' AND
       @UNIT4 is null or UNIT4 like '%'+@UNIT4+ '%'
END

The problem is, when I call my procedure like this:

exec A_TEST 'a', null, null, null 

the result is ok (just show from table TEST_FIND where UNIT 1 is 'a')

but when use

exec A_TEST null, 'b', null, null

the result is

select * from TEST_FIND

I don't know why, and what's the problem

Need fix this soon, help me

Thanks

3 Answers 3

1

What happens when you group your WHERE clauses? Like so:

WHERE
   ( @UNIT1 is null or UNIT1 like '%'+@UNIT1+ '%' )
   AND
   ( @UNIT2 is null or UNIT2 like '%'+@UNIT2+ '%' )
   AND
   ( @UNIT3 is null or UNIT3 like '%'+@UNIT3+ '%' )
   AND
   ( @UNIT4 is null or UNIT4 like '%'+@UNIT4+ '%' )
END
Sign up to request clarification or add additional context in comments.

Comments

0

use brackets in AND condition.

 CREATE PROCEDURE [dbo].[A_TEST]
@UNIT1 nvarchar(50) = NULL,
@UNIT2 nvarchar(50) = NULL,
@UNIT3 nvarchar(50) = NULL,
@UNIT4 nvarchar(50) = NULL
   AS
     BEGIN
       SELECT
        UNIT1,
     UNIT2,
     UNIT3,
     UNIT4
FROM
   TEST_FIND
    WHERE
  (@UNIT1 is null or UNIT1 like '%'+@UNIT1+ '%') AND
  (@UNIT2 is null or UNIT2 like '%'+@UNIT2+ '%' )AND
  (@UNIT3 is null or UNIT3 like '%'+@UNIT3+ '%')AND
  (@UNIT4 is null or UNIT4 like '%'+@UNIT4+ '%')
END

Comments

0

Apply parathesis for the OR coditions as follows:

CREATE PROCEDURE [dbo].[A_TEST]
@UNIT1 nvarchar(50) = NULL,
@UNIT2 nvarchar(50) = NULL,
@UNIT3 nvarchar(50) = NULL,
@UNIT4 nvarchar(50) = NULL
AS
BEGIN
SELECT
   UNIT1,
   UNIT2,
   UNIT3,
   UNIT4
FROM
  TEST_FIND
WHERE
   (@UNIT1 is null or UNIT1 like '%'+@UNIT1+ '%') AND
   (@UNIT2 is null or UNIT2 like '%'+@UNIT2+ '%') AND
   (@UNIT3 is null or UNIT3 like '%'+@UNIT3+ '%') AND
   (@UNIT4 is null or UNIT4 like '%'+@UNIT4+ '%')
  END

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.