sql >> Databáze >  >> RDS >> Sqlserver

Podmíněný příkaz v dotazu SQL na klasické stránce ASP

Ve VBScriptu můžete ke zřetězení řetězců použít symbol ampersand (&). Zkuste toto:

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  

K dotazu SQL máte tři samostatné klauzule „a“. Podmíněné příkazy jsou na sobě nezávislé, takže byste neměli používat elseif což je pro různé možnosti v rámci jednoho podmíněného příkazu. Je jednodušší zkontrolovat, zda řetězec není prázdný if stringname <> "" než pomocí len , (a pochybuji, že by vaše podmíněné příkazy fungovaly, protože se zdá, že používáte malé písmeno "o", kde byste měli používat nulu)

Je velmi snadné dělat chyby, když takto sestavujete SQL dotazy. Při testování se často vyplatí přidat řádek jako Response.Write strSqlData než se jej pokusíte provést, abyste zkontrolovali, zda je dotaz tím, co jste zamýšleli

Jak však naznačovaly další komentáře, váš kód je zranitelný vůči útoku SQL injection. Adresy URL, které obsahují ".asp?" lze téměř zaručit, že bude dříve nebo později zasažen útokem typu ASPROX. Parametrizované dotazy jsou nejlepším prostředkem, jak se tomu bránit, ale jedním rychlým přístupem, pokud jsou všechny hodnoty řetězce dotazů číselné, je použít cint() - např.

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

To způsobí chybu nesouladu typu, pokud řetězec dotazu obsahuje něco jiného než čísla, a skript se převrhne, než se pokusí provést váš dotaz SQL.



  1. mysqldump:Chyba 2020:Při vyhazování tabulky je paket větší než bajtů 'max_allowed_packet'

  2. Oracle SQL Developer 21.4.2 a SQLcl 21.4.1 jsou nyní k dispozici

  3. vztah many-to-many OrderBy - Laravel query builder

  4. převést datum do formátu data Mysql php