Click here to Skip to main content
15,892,737 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
CREATE FUNCTION [dbo].[udf_GenerateWhereQuery]
(@logic char(10), @Field varchar(250),@Operator varchar(100), @Value Nvarchar(max), @DataType varchar(100) ,@RowNum int)
RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @WhereQuery NVarchar(MAX),@SQLOperator NVARCHAR(MAX)
SET @SQLOperator = CASE
WHEN @DataType = 'String'
THEN CASE
WHEN @Operator = 'startswith'
THEN @Field + ' LIKE ' + 'N''' + @Value + '%' + ''''
WHEN @Operator = 'endswith'
THEN @Field + ' LIKE ' + 'N''' + '%' + @Value +''''
WHEN @Operator = 'eq'
THEN @Field + '=' + 'N''' + @Value + ''''
WHEN @Operator = 'neq'
THEN 'ISNULL(' + @Field + ','''')' + '<>' + 'N''' + @Value + ''''
WHEN @Operator='contains'
THEN @Field + ' LIKE ' + 'N'''+'%'+@Value + '%' + ''''
WHEN @Operator ='does not contain' OR @Operator ='doesnotcontain'
THEN 'ISNULL(' + @Field + ','''')' + ' NOT LIKE ' + 'N'''+'%'+@Value + '%' + ''''
END
WHEN @DataType = 'Numeric'
THEN CASE
WHEN @Operator = 'gte'
THEN @Field + ' >= ' + @Value
WHEN @Operator = 'lte'
THEN @Field + ' <= ' + @Value
WHEN @Operator = 'gt'
THEN @Field + ' > ' + @Value
WHEN @Operator = 'lt'
THEN @Field + ' < ' + @Value
WHEN @Operator = 'eq'
THEN @Field + '=' + @Value
WHEN @Operator = 'neq'
THEN @Field + '<>' + @Value
END
WHEN @DataType IN ('DateTime')
THEN CASE
WHEN @Operator = 'gte'
THEN @Field + ' >= ' +''''+ @Value +''''
WHEN @Operator = 'lte'
THEN @Field + ' <= ' +''''+ @Value +''''
WHEN @Operator = 'gt'
THEN @Field + ' > ' +''''+ @Value +''''
WHEN @Operator = 'lt'
THEN @Field + ' < ' +''''+ @Value +''''
WHEN @Operator = 'eq'
THEN @Field + '=' +''''+ @Value +''''
WHEN @Operator = 'neq'
THEN @Field + '<>' +''''+ @Value +''''
END
WHEN @DataType IN ('Date')
THEN CASE
WHEN @Operator = 'gte'
THEN 'CONVERT(varchar(10),'+@Field+',120)' + ' >= ' +''''+ CONVERT(varchar(10),@Value,120) +''''
WHEN @Operator = 'lte'
THEN 'CONVERT(varchar(10),'+@Field+',120)' + ' <= ' +''''+ CONVERT(varchar(10),@Value,120) +''''
WHEN @Operator = 'gt'
THEN 'CONVERT(varchar(10),'+@Field+',120)' + ' > ' +''''+ CONVERT(varchar(10),@Value,120) +''''
WHEN @Operator = 'lt'
THEN 'CONVERT(varchar(10),'+@Field+',120)' + ' > ' +''''+ CONVERT(varchar(10),@Value,120) +''''
WHEN @Operator = 'eq'
THEN 'CONVERT(varchar(10),'+@Field+',120)' + ' = ' +''''+ CONVERT(varchar(10),@Value,120) +''''
WHEN @Operator = 'neq'
THEN 'CONVERT(varchar(10),'+@Field+',120)' + ' <> ' +''''+ CONVERT(varchar(10),@Value,120) +''''
END
WHEN @DataType = 'Boolean'
THEN CASE
WHEN @Operator = 'eq'
THEN @Field + '=' +''''+ @Value +''''
END
END
SET @WhereQuery=
CASE
WHEN @logic = '' THEN '('+@SQLOperator+')'
WHEN @logic in('and','or') AND @RowNum=2 THEN ' '+@logic+ ' '+@SQLOperator+')'
WHEN @logic in('and','or') AND @RowNum=1 THEN '('+@SQLOperator
END
RETURN @WhereQuery
END

What I have tried:

Trying to understand the logic of the function and output as well.
Posted
Updated 13-Jul-16 21:40pm
Comments
Suvendu Shekhar Giri 14-Jul-16 3:24am    
Haven't you created this?
Best to ask who created it. We can help only if you have a problem/doubt in specific part of the stored proc.

1 solution

It's pretty simple - and rather pointless, really.
You pass it text based parameters and it converts them to valid SQL WHERE condition as a string.
So you use it:
SQL
[dbo].[udf_GenerateWhereQuery]('AND', 'nameOfColumn', 'gte', '666', 'numeric')

And it returns
SQL
'AND nameOfColumn >= 666'


Which would I rather read in my code? Not the function call...
The only advantage of this is that it can take values from a DB and generate SQL that can be executed - but that's dangerous as it leaves you open to SQL Injection.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900