2009-07-08 1 views
1

Я хочу использовать ключевое слово like в динамически параметризованном запросе. Я хочу защитить свой запрос от SQL-инъекций, поэтому я не хочу передавать значение, вместо этого хочу передать свои критерии во время выполнения запроса,LIKE в динамических запросах

Есть ли способ, которым я могу это сделать?

SELECT 
    ComposeMail.ID, 
    ComposeMail.DateTime, 
    ComposeMail.Subject, 
    ComposeMail.CreatedBy, 
    ComposeMail.ReceiverStatus, 
    Users.Name, 
    ROW_NUMBER() OVER(ORDER BY '+ @p_SortExpression +') AS Indexing 
FROM 
    ComposeMail 
INNER JOIN 
    Users 
ON 
    ComposeMail.CreatedBy = Users.ID 
WHERE 
    ([email protected]) 
    AND (
    ReceiverStatus=3 
    OR ReceiverStatus=4 
) 
    AND (
    (Subject Like ''%' + @p3 + '%'') 
    OR (Body Like ''%' + @p3 + '%'') 
    OR (Name Like ''%' + @p3 + '%'') 
) 

Это моя динамическая строка запроса. Я не хочу передавать значение здесь.

ответ

5

Чтобы предотвратить против введения в динамическом запросе вы всегда хотите сделать что-то вроде этого (вместо того, чтобы делать «+ @var +» в вашем примере)

DECLARE @query nvarchar(2000), 
     @paramList nvarchar(2000) 

SET @query = 'SELECT * FROM dbo.Orders WHERE custLastName LIKE ''%'' + @custLastName + ''%''' 
SET @paramList = '@custLastName varchar(30)' 

EXEC SP_EXECUTESQL @query, @paramList, @custLastName 

редактировать: пример обновлен для использования LIKE

+0

Это нормально для LIKE положений, но, к сожалению, вы не можете использовать эту технику для параметризации ORDER BY выражения от вопроса. – LukeH

0
WHERE  (LastName LIKE N'%' + @Family + N'%') OR 
         (RegNo LIKE N'%' + @Codemeli + N'%') 

как в динамическом SQL запроса