Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Bedingte Anweisung in einer SQL-Abfrage auf einer klassischen ASP-Seite

In VBScript können Sie das kaufmännische Und-Symbol (&) verwenden, um Zeichenfolgen zu verketten. Versuchen Sie Folgendes:

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  

Sie haben drei separate "and"-Klauseln, die Sie an Ihre SQL-Abfrage anhängen können. Die Bedingungsanweisungen sind voneinander unabhängig, daher sollten Sie elseif nicht verwenden was für verschiedene Optionen innerhalb einer einzigen bedingten Anweisung gilt. Es ist einfacher zu prüfen, ob ein String nicht leer ist if stringname <> "" als mit len , (und ich bezweifle, dass Ihre bedingten Anweisungen funktionieren würden, da Sie anscheinend einen Kleinbuchstaben "o" verwenden, wo Sie eine Null verwenden sollten)

Es ist sehr einfach, Fehler zu machen, wenn Sie solche SQL-Abfragen zusammenstellen. Beim Testen lohnt es sich oft, eine Zeile wie Response.Write strSqlData hinzuzufügen bevor Sie versuchen, sie auszuführen, um zu überprüfen, ob die Abfrage Ihren Absichten entspricht

Wie andere Kommentare jedoch andeuten, ist Ihr Code anfällig für einen SQL-Injection-Angriff. URLs, die ".asp?" früher oder später fast garantiert von einem Angriff vom Typ ASPROX getroffen werden. Parametrisierte Abfragen sind das beste Mittel, sich davor zu schützen, aber ein schneller Ansatz, wenn Ihre Querystring-Werte alle numerisch sind, ist die Verwendung von cint() - zB

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

Dadurch wird ein Typkonfliktfehler ausgelöst, wenn die Abfragezeichenfolge etwas anderes als Zahlen enthält, und das Skript wird umfallen, bevor es versucht, Ihre SQL-Abfrage auszuführen.