Today, I just learned a neat trick that allows you to have a "dynamic" stored procedure without building a query string and executing it.
For example, let's say we have the following table:
candidateID int
firstName varchar(25)
lastName varchar(25)
email varchar(100)
isActive bit
Typically, if I wanted to be able to search this table by any combination of candidate ID, First Name, Last Name or Email, I would have built a query like this:
However, today, my coworker showed me something that looks more clean and isn't "dynamically" built.Code:CREATE PROC[dbo].[usp_SearchCandidates] @candidateID int, @firstName varchar(25), @lastName varchar(25), @email varchar(100) AS SET NO COUNT ON DECLARE @sql varchar(600) SELECT @sql = 'SELECT candidateID, firstName, lastName, email FROM candidates WHERE isActive = 1 ' IF (@candidateID IS NOT NULL) BEGIN SELECT @sql = @sql + ' AND candidateID = ' + @candidateID + ' ' END IF (@firstName IS NOT NULL) BEGIN SELECT @sql = @sql + ' AND firstName = ''' + REPLACE(@firstname,'''','''''') + ''' ' END IF (@lastName IS NOT NULL) BEGIN SELECT @sql = @sql + ' AND lastName = ''' + REPLACE(@lastname,'''','''''') + ''' ' END IF (@email IS NOT NULL) BEGIN SELECT @sql = @sql + ' AND email = ''' + REPLACE(@email,'''','''''') + ''' ' END EXEC(@sql)
For this to work, all parameters that aren't being utilized in the query should have a NULL value.Code:CREATE PROC [dbo].[usp_SearchCandidates] @candidateID int, @firstName varchar(25), @lastName varchar(25), @email varchar(100) AS SET NO COUNT ON SELECT [candidateID], [firstName], [lastName], [email] FROM [candidates] WHERE (isActive = 1 AND candidateID = ISNULL(@candidateID, candidateID) AND firstName = ISNULL(@firstName, firstName) AND lastName = ISNULL(@lastName, lastName) AND email = ISNULL(@email, email))



LinkBack URL
About LinkBacks
Reply With Quote


Bookmarks