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

#sql #tsql #procedure

#sql #tsql #процедура

Вопрос:

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

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

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

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

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

Ответ №1:

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

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

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

Комментарии:

1. Да, я думал об этом раньше. Но это не будет общедоступным, это небольшой проект для школы

2. @mario ты напомнил мне об этом: imgs.xkcd.com/comics/exploits_of_a_mom.png

3. ahhaha @lcarus это так бесценно: P Дело не в том, что я не могу это исправить, скорее, слишком ленив, чтобы делать больше процедур, когда это сделает это. Создание баз данных — это не мое

Ответ №2:

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

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

Ответ №3:

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

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

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

Выберите * из текста, ГДЕ textlike ‘%text%’