#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:
Несколько комментариев:
- Выполнять подобный код — очень плохая практика. Ваша хранимая процедура подвержена атакам с использованием SQL-инъекций
- Не делайте
select * from ...
этого, это антипаттерн. Вы должны получить список именно тех столбцов, которые вам нужны из таблицы. Несколько преимуществ: повышает производительность, улучшает читаемость, позволяет избежать непредвиденных ошибок, если кто-то добавляет / удаляет столбцы в таблицу, а вы выполняетеinsert into table select * ...
Ваш процесс в его нынешнем виде сам по себе не содержит синтаксических ошибок, но вы получаете синтаксические ошибки при его вызове, потому что забыли пробел после @case
, поэтому он печатает что-то вроде:
Выберите * из текста, ГДЕ textlike ‘%text%’