Below is a compact version of my rather lengthy SP. As you can see, the only difference between the code in the IF/ELSE blocks is the WHERE clause looks for IS NULL or IS NOT NULL depending on the value of @isRegistered. CREATE PROCEDURE dbo.ProviderSearch @firstName VARCHAR(50) = NULL @isRegistered BITASBEGIN IF(@isRegistered = 1) BEGIN SELECT TOP(10) * FROM dbo.Provider prv WHERE ((@firstName IS NULL OR @firstName = '') OR (prv.FirstName LIKE @firstName + '%')) AND prv.AppUserID IS NULL END ELSE BEGIN SELECT TOP(10) * FROM dbo.Provider prv WHERE ((@firstName IS NULL OR @firstName = '') OR (prv.FirstName LIKE @firstName + '%')) AND prv.AppUserID IS NOT NULL ENDEND
In addition to the problem of repeated code, I now need to actually bring back all of the rows in the Provider table regardless of the value of the AppUserID column. My initial thoughts are to do something like:CREATE PROCEDURE dbo.ProviderSearch @firstName VARCHAR(50) = NULL @isRegistered BIT = NULLASBEGIN IF(@isRegistered IS NOT NULL) BEGIN IF(@isRegistered = 1) BEGIN SELECT TOP(10) * FROM dbo.Provider prv WHERE ((@firstName IS NULL OR @firstName = '') OR (prv.FirstName LIKE @firstName + '%')) AND prv.AppUserID IS NULL END ELSE BEGIN SELECT TOP(10) * FROM dbo.Provider prv WHERE ((@firstName IS NULL OR @firstName = '') OR (prv.FirstName LIKE @firstName + '%')) AND prv.AppUserID IS NOT NULL END END ELSE BEGIN SELECT TOP(10) * FROM dbo.Provider prv WHERE ((@firstName IS NULL OR @firstName = '') OR (prv.FirstName LIKE @firstName + '%')) AND ENDEND
Is there a better way of doing this?