Добавление оператора LIKE в предложение WHERE (динамический SQL)

#sql #sql-server #where-clause #dynamic-sql #sql-like

#sql #sql-сервер #where-предложение #dynamic-sql #sql-подобный

Вопрос:

Я использую динамический SQL для создания инструкции SQL ‘SELECT’, которая будет выполнена. В инструкции SQL, которую я создаю, я хочу использовать оператор ‘LIKE’, но поскольку при этом используются кавычки «, он конфликтует с кавычками, используемыми в начале инструкции ‘SELECT’.

 SET @sql = 'SELECT * FROM LogTable WHERE Application LIKE '   @ApplicationName   ' ;'
  

Предполагая, что ‘@ApplicationName = TestApp’, приведенная выше динамическая переменная SQL ‘@sql’ выдаст следующий оператор SQL:

 SELECT * FROM LogTable WHERE Application LIKE TestApp ;
  

Это приведет к ошибке, поскольку кавычки не существуют вокруг ‘TestApp’. Как можно создать кавычки в динамическом SQL, позволяющие использовать оператор ‘LIKE’? Как можно создать приведенную ниже инструкцию SQL:

 SELECT * FROM LogTable WHERE Application LIKE 'TestApp' ;
  

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

1. Даже если у вас это получится, остерегайтесь маленьких таблиц Bobby. Если он когда-либо выполнит поиск %TestApp%'; DROP TABLE LogTable; SELECT 'You were just SQL Inject Attacked , вы можете получить «неожиданные результаты»! Ради всего святого, пожалуйста, не используйте эту структуру, используйте параметризованные запросы (они ЖЕ подготовленные операторы) .

2. почему вы используете поиск like без подстановочных знаков? кроме того, если это что-то простое, как это, зачем вообще использовать динамический SQL?

3. Я намереваюсь реализовать приложение MVC, в котором должен быть выпадающий список с заранее определенными значениями. Выбор этих значений должен изменить @ApplicationName . Я намеревался использовать ‘LIKE’, чтобы при выборе пустого поля он заменял поисковый запрос оператора ‘LIKE’ на ‘%’, чтобы вывести все.

4. по-прежнему не объясняет, зачем вам нужен динамический sql

5. Вы создаете текст в приложении и передаете его в SQL? или вы строите на SQL? В любом случае, лучше заменить его хранимой процедурой SQL, которая принимает параметр, когда параметр равен null, возвращает все.

Ответ №1:

Я буду использовать SP_EXECUTESQL там, где вы не хотите беспокоиться об одинарных кавычках

 Declare  @sql NVARCHAR(max)

SET @sql = 'SELECT * FROM LogTable WHERE Application LIKE  @ApplicationName ;'

EXEC Sp_executesql
  @sql,
  N'@ApplicationName varchar(100)',
  @ApplicationName = @ApplicationName 
  

Также это позволяет избежать внедрения SQL

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

1. Кроме того, вам не нужно беспокоиться о атаках с использованием SQL-инъекций. Всегда, просто всегда, используйте параметризованные запросы, подобные этому 🙂

2. и вам не нужно беспокоиться, если кто-то ищет что-то с a ' в нем

3.Это то же самое, что и я. Если строковый литерал содержит a ' , то ваш подготовленный оператор отлично справится с этим, но структура OP потерпит неудачу из-за того, что SQL имеет что-то вроде LIKE 'Fred's App' (середина ' приводит к завершению строки и s App' является синтаксической ошибкой).

Ответ №2:

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

 SET @sql = 
    'SELECT * FROM LogTable WHERE Application LIKE '''   @ApplicationName   ''';'
  

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

1. Вы только что помогли кому-то открыть свой код для атак с использованием SQL-инъекций.