Reputation: 5670
My Stored Procedure is like this
alter PROCEDURE ph_GetAllStaffAddressByCamp
@CampCode VARCHAR(20)
AS
IF NULLIF(@CampCode, '') IS NULL
DECLARE @Year VARCHAR(2)
EXEC cs_GetCurrentYear @Year OUTPUT
SELECT DISTINCT [VolID], [CampID] FROM [vStaffJobAndCamp]
WHERE
IF @CampCode IS NULL
CampCode like @Year +%
ELSE
CampCode = @CampCode
Everything looks okay to me, But it throws compile error like this
Msg 156, Level 15, State 1, Procedure ph_GetAllStaffAddressByCamp, Line 14
Incorrect syntax near the keyword 'IF'.
Msg 102, Level 15, State 1, Procedure ph_GetAllStaffAddressByCamp, Line 15
Incorrect syntax near 'CampCode'.
Does any one know what I am doing wrong?
Upvotes: 1
Views: 409
Reputation: 317
If you want a good execution plan, you should avoid OR logic in WHERE clauses.
ALTER PROCEDURE ph_GetAllStaffAddressByCamp
@CampCode VARCHAR(20)
AS
IF @CampCode IS NULL OR @CampCode = ''
BEGIN
DECLARE @Year VARCHAR(2)
EXEC cs_GetCurrentYear @Year OUTPUT
SELECT DISTINCT [VolID], [CampID] FROM [vStaffJobAndCamp]
WHERE CampCode LIKE @Year+'%'
END
ELSE
SELECT DISTINCT [VolID], [CampID] FROM [vStaffJobAndCamp]
WHERE CampCode = @CampCode
Upvotes: 0
Reputation: 19
case Campcode WHEN @CampCode IS NULL THEN CampCode like @Year +% ELSE CampCode = @CampCode END
use case instead of IF condition in where clause.
Upvotes: 0
Reputation: 3084
You forgot BEGIN...END in IF clause. And WHERE conditions was also wrong
alter PROCEDURE ph_GetAllStaffAddressByCamp
@CampCode VARCHAR(20)
AS
IF NULLIF(@CampCode, '') IS NULL
BEGIN
DECLARE @Year VARCHAR(2)
EXEC cs_GetCurrentYear @Year OUTPUT
SELECT DISTINCT [VolID], [CampID] FROM [vStaffJobAndCamp]
WHERE
(@CampCode IS NULL and CampCode like @Year +%) OR
(@CampCode IS NOT NULL and CampCode = @CampCode)
END
Upvotes: 1
Reputation: 40536
IF
is not a valid SQL keyword. Therefore, you cannot use it inside a SELECT
statement.
You could express those conditions in valid SQL like so:
WHERE
(@CampCode IS NULL AND CampCode like @Year + '%')
OR
(@CampCode is NOT NULL AND CampCode = @CampCode)
Upvotes: 1