Sql процедура поиска - PullRequest
       7

Sql процедура поиска

1 голос
/ 07 октября 2011

У меня есть хранимая процедура, которая будет искать всю базу данных. Это процедура

  CREATE PROCEDURE spGetSearchResults
    @table varchar(50) = null,
    @case varchar(50) = null,
    @value varchar(100) = null
as

exec('Select * from ' + @table + ' WHERE ' + @case + 'like ''%'+ @value +'%''')

Но почему-то выдает ошибку. Неправильный синтаксис рядом с '% (значение текста)%'

но если я сделаю обычный оператор выбора со значениями, закодированными жестко, то он будет работать нормально

Ответы [ 3 ]

1 голос
/ 07 октября 2011

Вот проблема.Вам нужно добавить пробел перед предложением like.Это должно сделать это для вашего exec() звонка:

exec('Select * from ' + @table + ' WHERE ' + @case + ' like ''%'+ @value +'%''')
1 голос
/ 07 октября 2011

Несколько комментариев:

  1. Это очень плохая практика - выполнять такой код. Ваша хранимая процедура подвержена атакам SQL-инъекций
  2. Не делай select * from ... это антипаттерн. Вы должны составить список именно тех столбцов, которые вам нужны из таблицы. Несколько преимуществ: повышает производительность, улучшает читабельность, позволяет избежать неожиданных ошибок, если кто-то добавляет / удаляет столбцы в таблице, а вы делаете insert into table select * ...

Ваш процесс в том виде, в каком он есть, сам по себе не имеет никаких синтаксических ошибок, но вы получаете синтаксические ошибки при его вызове, потому что вы забыли пробел после @case, поэтому он печатает что-то вроде:

Выбрать * из текста, ГДЕ текстовое '% text%'

1 голос
/ 07 октября 2011

Вам не хватает пробела. Поставьте пробел перед like ...

exec('Select * from ' + @table + ' WHERE ' + @case + ' like ''%'+ @value +'%''')

Тем не менее, эта процедура поднимает sql инъекцию флаг ...

...