2016-10-07 12 views
1

Я использую Dynamic SQL для создания оператора SELECT SQL, который будет выполнен. В выражении SQL, которое я создаю, я хочу использовать оператор «LIKE», но поскольку он использует инвертированные запятые », он конфликтует с инвертированными запятыми, используемыми в начале инструкции SELECT.Добавление оператора LIKE в предложение WHERE (динамический SQL)

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' ; 
+2

Даже если вы получите эту работу, остерегайтесь Маленьких таблиц Бобби. Если он когда-либо ищет '% TestApp% '; DROP TABLE LogTable; SELECT «Вы были просто SQL Inject Attacked», тогда вы можете получить «неожиданные результаты»! Для любви ко всем вещам, пожалуйста, не используйте эту структуру, используйте Parameterized Queries * (Подготовленные утверждения AKA) *. – MatBailie

+2

Почему вы используете поиск без подстановочных знаков? также, если это что-то простое, почему бы даже использовать динамический SQL в первую очередь? –

+0

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

ответ

-1

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

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

Вы только что помогли кому-то открыть свой код для SQL Injection Attacks. – MatBailie

6

я буду использовать 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

+0

Кроме того, вам не нужно беспокоиться о SQL Injection Attacks. Всегда, всегда, используйте параметризованные запросы вроде этого :) – MatBailie

+0

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

+0

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