2009-07-08 17 views
1

Je souhaite utiliser le mot clé like dans une requête paramétrée dynamique. Je veux protéger ma requête des injections SQL, donc je ne veux pas passer la valeur, mais je veux passer mes critères lors de l'exécution de la requête,LIKE dans les requêtes dynamiques

Y a-t-il un moyen de le faire?

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 + '%'') 
) 

Ceci est ma chaîne de requête dynamique. Je ne veux pas passer la valeur ici.

Répondre

5

Pour prévenir contre l'injection dans une requête dynamique, vous voulez toujours faire quelque chose comme ça (au lieu de faire « + @var + » dans votre exemple)

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 

edit: par exemple mis à jour pour utiliser COMME

+0

Ceci est très bien pour les clauses LIKE, mais malheureusement vous ne pouvez pas utiliser cette technique pour paramétrer le ORDER BY expression de la question. – LukeH

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

comme dans la requête SQL dynamique

Questions connexes