Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Instruction conditionnelle dans une requête sql sur une page ASP classique

Dans VBScript, vous pouvez utiliser le symbole esperluette (&) pour concaténer des chaînes. Essayez ceci :

strSqlData="select * from MyTable where gender='male'" 

if AcademicYear <> "" then 
strSqlData= strSqlData & " and AcademicYear=" & AcademicYear
end if

if Batch <> "" then
strSqlData= strSqlData & " and Batch=" & Batch    
end if  

if School <> "" then 
strSqlData= strSqlData & " and School=" & School
end if  

Vous avez trois clauses "et" distinctes à ajouter à votre requête sql. Les instructions conditionnelles sont indépendantes les unes des autres, vous ne devriez donc pas utiliser elseif qui est pour différentes options dans une seule instruction conditionnelle. Il est plus simple de vérifier si une chaîne n'est pas vide ou non if stringname <> "" que d'utiliser len , (et je doute que vos instructions conditionnelles fonctionnent car vous semblez utiliser une lettre minuscule "o" là où vous devriez utiliser un zéro)

Il est très facile de faire des erreurs lorsque vous assemblez des requêtes sql comme celle-ci. Lors des tests, il vaut souvent la peine d'ajouter une ligne comme Response.Write strSqlData avant d'essayer de l'exécuter pour vérifier que la requête correspond à ce que vous souhaitiez

Comme d'autres commentaires l'ont suggéré, votre code est vulnérable à une attaque par injection SQL. Les URL contenant ".asp?" peut presque être garanti d'être touché par une attaque de type ASPROX tôt ou tard. Les requêtes paramétrées sont le meilleur moyen de se prémunir contre cela, mais une approche rapide si vos valeurs de chaîne de requête sont toutes numériques consiste à utiliser cint() - par exemple

strSqlData= strSqlData & " and AcademicYear=" & cint(AcademicYear)

Cela lancera une erreur d'incompatibilité de type si la chaîne de requête contient autre chose que des nombres, et le script tombera avant de tenter d'exécuter votre requête sql.