переменные sql - PullRequest
       29

переменные sql

1 голос
/ 24 марта 2009

Может кто-нибудь помочь мне понять, почему SQL-выражению не нравится следующая строка 'and' + @SearchCat + 'как'% '+ @ Keywords +'% ''. Это связано с количеством одинарных кавычек, но я не могу понять. Как работают цитаты. В чем логика?

DECLARE @strStatement varchar(550) 
declare @state as varchar(50)
declare @district as varchar(50)
declare @courttype as varchar(50)
declare @SearchCat as varchar(50)
declare @KeyWords as varchar (50)

select @State ='FL'
select @district = '11'
select @courtType = '1'
select @SearchCat='CaseNumber'
select @KeyWords='File'


select @strStatement= 'SELECT CaseNumber FROM app_Case 
            where State ='''+ @State+
            ''' and District='''+ @District+
            ' and ' + @SearchCat + 'like '%'+@Keywords+'%''


exec (@strStatement)

Ответы [ 2 ]

2 голосов
/ 24 марта 2009

Я пропустил пробел перед "как"

Вы также неверно указали одинарные кавычки вокруг ваших символов "%", что может привести к путанице.

Кстати, вы сами сделали небольшую SQL-инъекцию дыру в безопасности внутри самого SQL! Если один из параметров содержит апостроф, ваш sqlStatement сломается и будет выполнен любой мошеннический SQL в имени параметра.

Вы можете использовать функцию REPLACE, чтобы удвоить одинарные кавычки, чтобы предотвратить эту атаку:

' AND '+QUOTENAME(@SearchCat)+' LIKE ''%'+REPLACE(@Keywords, '''', '''''')+'%''...'

(QUOTENAME необходимо, если имя столбца содержит символы вне диапазона или является зарезервированным словом.)

Более чистый (но довольно многословный) подход к генерации SQL, чем утомительное ЗАМЕНА каждого строкового литерала самостоятельно, заключается в использовании sp_executesql . Например:

SELECT @strStatement= N'
    SELECT @Number= CaseNumber FROM app_Case 
    WHERE State=@State AND District=@District
    AND '+QUOTENAME(@SearchCat)+N' LIKE ''%''+@Keywords+''%''
';
SELECT @params= N'@State varchar(50), @District varchar(50), @Keywords varchar(50), @Number int OUTPUT';

EXECUTE sp_executesql @strStatement, @params, @State, @District, @Keywords, @Number OUTPUT;

Между прочим, если @searchCat может иметь только небольшое количество различных значений, вы можете использовать обходной путь, чтобы вообще не выполнять эту трудоемкую бессмысленную работу с динамическим SQL:

SELECT CaseNumber FROM app_Case
WHERE State=@State AND District=@District
AND CASE @searchCat
    WHEN 'searchableColumnA' THEN searchableColumnA
    WHEN 'searchableColumnB' THEN searchableColumnB
END LIKE '%'+@Keywords+'%';

См. это довольно хорошее исследование динамически созданных операторов SQL в T-SQL для получения дополнительной информации и некоторых рисков, с которыми вы сталкиваетесь.

0 голосов
/ 24 марта 2009

Я понял это. Я пропустил пробел перед "как"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...