Member 10033441 Ответов: 1

Не могли бы вы объяснить вывод этой функции


Создайте функцию [dbo].[udf_GenerateWhereQuery]
(@логики типа char(10), @поля типа varchar(250),@оператор типа varchar(100), @значение имеет тип nvarchar(Макс), @тип данных varchar(100) ,@параметр rownum инт)
ВОЗВРАЩАЕТ NVARCHAR(МАКС.)
АС
НАЧАТЬ
Объявите @WhereQuery NVarchar (MAX),@SQLOperator NVARCHAR(MAX)
SET @SQLOperator = CASE
Когда @тип = "строка"
ТОГДА ДЕЛО
Когда @Operator = 'startswith'
Тогда @поле + " как " + 'Н"' + параметре @value + '%' + ""
Когда @Operator = 'endswith'
Тогда @Field + 'LIKE' + 'N" ' + ' % ' + @Value +""
Когда @Operator = 'eq'
Тогда @Field + ' = ' + 'N" ' + @Value + ""
Когда @Operator = 'neq'
Тогда функция isnull(' + @поле + ',"")' + '&ЛТ;&ГТ;' + 'Н"' + @значение + ""
Когда @Operator='contains'
Тогда @поле + " как " + 'Н"'+'%'+параметре@value + '%' + ""
Когда оператор @= "не содержит" или doesnotcontain @оператор =''
Тогда функция isnull(' + @поле + ',"")' + 'не нравится' + 'Н"'+'%'+параметре@value + '%' + ""
КОНЕЦ
Когда @DataType = 'Numeric'
ТОГДА ДЕЛО
Когда @Operator = 'gte'
Тогда @Field + '>= ' + @Value
Когда @Operator = 'lte'
Затем @Field + '<= ' + @Value
Когда @Operator = 'gt'
Затем @Field + '> ' + @Value
Когда @Operator = 'lt'
Затем @Field + '< ' + @Value
Когда @Operator = 'eq'
Тогда @Field + '=' + @Value
Когда @Operator = 'neq'
Затем @Field + '< & gt;' + @Value
КОНЕЦ
Когда @DataType IN ('DateTime')
ТОГДА ДЕЛО
Когда @Operator = 'gte'
Тогда @Field + '>= ' + "" + @Value +""
Когда @Operator = 'lte'
Тогда @Field + '<= ' + "" + @Value +""
Когда @Operator = 'gt'
Затем @Field + '> ' +""+ @Value +""
Когда @Operator = 'lt'
Затем @Field + '< ' +""+ @Value +""
Когда @Operator = 'eq'
Тогда @Field + ' = ' + "" + @Value +""
Когда @Operator = 'neq'
Затем @Field + '< & gt;' +""+ @Value +""
КОНЕЦ
Когда @DataType IN ('дата')
ТОГДА ДЕЛО
Когда @Operator = 'gte'
Затем конвертировать(тип varchar(10),'+@поле+',120)' + в '>= ' +""+ конвертировать(тип varchar(10),@значением,120) +""
Когда @Operator = 'lte'
Затем 'CONVERT(varchar(10),' +@Field+', 120)' + '<= ' + "" + CONVERT(varchar(10),@Value, 120) +""
Когда @Operator = 'gt'
Затем конвертировать(тип varchar(10),'+@поле+',120)' + в '> ' +""+ конвертировать(тип varchar(10),@значением,120) +""
Когда @Operator = 'lt'
Затем конвертировать(тип varchar(10),'+@поле+',120)' + в '> ' +""+ конвертировать(тип varchar(10),@значением,120) +""
Когда @Operator = 'eq'
Затем 'CONVERT(varchar(10),' +@Field+',120)' + ' = ' +""+ CONVERT (varchar(10),@Value, 120) +""
Когда @Operator = 'neq'
Затем конвертировать(тип varchar(10),'+@поле+',120)' + в '< и GT; ' +""+ конвертировать(тип varchar(10),@значением,120) +""
КОНЕЦ
Когда @DataType = 'Boolean'
ТОГДА ДЕЛО
Когда @Operator = 'eq'
Тогда @Field + ' = ' + "" + @Value +""
КОНЕЦ
КОНЕЦ
SET @WhereQuery=
ДЕЛО
WHEN @logic = " THEN '('+@SQLOperator+')'
Когда @логики в('и','или') и @параметр rownum=2, то ' '+@логики+ ' '+@SQLOperator+')'
Когда @логики в('и','или') и @параметр rownum=1 тогда '('+@SQLOperator
КОНЕЦ
RETURN @WhereQuery
КОНЕЦ

Что я уже пробовал:

Пытаясь понять логику функции и вывода, а также.

Suvendu Shekhar Giri

Разве не вы создали это?
Лучше всего спросить, кто его создал. Мы можем помочь только в том случае, если у вас есть проблема/сомнение в конкретной части сохраненного процесса.

1 Ответов

Рейтинг:
2

OriginalGriff

Это довольно просто - и довольно бессмысленно, на самом деле.
Вы передаете ему текстовые параметры, и он преобразует их в допустимое условие SQL WHERE в виде строки.
Так что вы его используете:

[dbo].[udf_GenerateWhereQuery]('AND', 'nameOfColumn', 'gte', '666', 'numeric')

И он возвращается
'AND nameOfColumn >= 666'


Что бы я предпочел прочитать в своем коде? Не вызов функции...
Единственное преимущество этого метода заключается в том, что он может принимать значения из БД и генерировать SQL, который может быть выполнен, но это опасно, так как оставляет вас открытым для SQL - инъекции.