05. august 2002 - 17:20Der er
25 kommentarer og 2 løsninger
if/else i MS-SQL (søgemaskine)
Hej
Jeg er ved at lave en søgemaskine. Der er 9 felter hvori man kan indtaste søgeord. Alle kan altså enten være 0 eller 1 (tom/udfyldt).
Jeg kan ikke huske min gamle matematik lærdom, er det 2 i 9., eller 9 i 2.? Det giver jo som bekendt enten 512 eller 81 mulige måder at indtaste på i felterne.
Dette svar skal jeg bruge, da jeg skal vide om jeg har valgt den rette fremgangsmåde.
Jeg skal jo alt efter hvad brugeren indtaster lave et SQL kald til min database.
Lige nu laver jeg noget ASP kode der for én af de mulige måder man kan indtaste på ser sådan ud:
If Request.QueryString("CSEARCH") <> "" And Request.QueryString("CNAME") = "" And Request.QueryString("PHONE") = "" And Request.QueryString("CAREA") = "" And Request.QueryString("ADDRESS") = "" And Request.QueryString("ZIPCODE") = "" And Request.QueryString("CITY") = "" And Request.QueryString("WEB") = "" And Request.QueryString("EMAIL") = "" Then rsSearch.Source = "SELECT * FROM dbo.customer WHERE BRANCH LIKE '%" + Replace(rsSearch__VarCSEARCH, "'", "''") + "%' ORDER BY CNAME ASC" End If
Det skrives i ASP/UltraDev4 og MS-SQL 2000
Er der 81 mulige måder, kan det lade sige gøre og komme til at virke (Jeg har lavet de 36 indtil nu). Men det er noget besværligt. Er der 512 mulige måder, så er fremgangsmåde jo helt umulig.
Min matematiklærer ville heller ikke være stolt, for jeg kan heller ikke huske det. Men jeg ville lave en anden vinkel på den.
Hvis et felt er udfyldt, vil du kunne se det af Request.Form(felt). Så du kunne eks. lave noget i denne stil:
For Each Item In Request.Form If Request.Form(Item) <> "" Then If strSQL = "" Then strSQL = " WHERE " & Item & " = '" & Request.Form(Item) & "'" Else strSQL = strSQL & " AND " & Item & " = '" & Request.Form(Item) & "'" End If End If Next
Hvis du giver dine form felter samme navne som felterne i databasen, opbygger den en dynamisk WHERE clause for dig. Den skal selvfølgelig finpudses ift. submit knappen og evt. nummeriske felter m.v.. Men du bør kunne se ideen.
guys! 0 og 1... det er 2 muligheder, right... Hvis der kun var ET felt var der 2 muligheder (2) Med 2 felter 2*2 med 3 felter 2*2*2.... altså 2^9 = 2*2*2....2*2 =512!
Har du overvejet en stored procedure med parametre for hver af søgefelterne og en default-værdi på null?
Jeg har et eksempel her, som kører mod en database, jeg har lokalt:
<Script begin> create procedure SearchTable ( @Account nvarchar(20) = null, @Name nvarchar(40) = null, @Type tinyint = null ) as set nocount on if not @Account is null set @Account = '%' + @Account + '%' if not @Name is null set @Name = '%' + @Name + '%'
set nocount off select * from Accounts where ( (Account like @Account) or (@Account is null) ) and ( (Name like @Name) or (@Name is null) ) and ( (Type = @Type) or (@Type is null) ) order by Account <Script end>
Der er godt nok kun tre parametre, men det skulle være lige ud af landevejen at udvide det efter behov.
Der returneres et recordset, der kan arbejdes videre på i ASP-koden.
Jeg glemte lige - med denne metode skal du teste for, om de ni søgefelter er udfyldt og hvis de er, så lægge dem i den korrekte parameter på Command-objektet.
Når jeg laver min Command i UltraDev og forsøger at teste mit recordset fortæller den at der ikke er forbindelse til serveren og at jeg skal tjekke min ODBC?? Der er jo forbindelse, ellers ville jeg jo ikke kunne vælge min Stored Procedure og trække variablerne ind? Hvad går der galt?
Nu har jeg fået mit Command objekt i UD til at virke, sådan da... Det skal måske lige nævnes at min tabel i DBen har ca. 600.000 records! UD laver derfor timeout når jeg forsøger at få en tabel retur i Command??
benny >> indexes vil ikke give nogen performance forbedring hvis der anvendes LIKE som specificert i dit eksempel. Du kan kun bruge et index i LIKE søgninger, hvis søgeordet ikke starter med en wilcchar. Eksempelvis vil LIKE '%Something%' ikke kunne anvende et index, mens LIKE 'Something%' kan.
tmceu >> OK. Så må det være i første omgang time out værdierne, der skal skrues på. Men der kan være andre faktorer på SQL Serveren, som gør, at den bliver lang tid om det. IMO er 600.000 records ikke noget at snakke om for SQL Server.
Enig. Jeg arbejder dagligt med adskillige SQL Server databaser med millioner af records, så det er i sig selv ikke noget problem. IIS og SQL Serverens konfiguration og placering ift. hinanden vil ofte være et større problem.
Jeg ville kigge på Query timeout på SQL Server og CommandTimeout på connection objektet i ASP.
Hvis jeg i UD taster et "Default value" i min Command, f.eks. 2100 på ZIPCODE så finder den et par records i min lille test tabel.
Men nu bygges det her kode op i en søgeresultat-side, og jeg vil derfor gerne request fra indput værdierne fra min søgeform via min URL string.
Mine Dim-objekter ser ud som følgende:
<% Dim spAdvancedSearch__CNAME spAdvancedSearch__CNAME = "" if(undefined <> "") then spAdvancedSearch__CNAME = Request("CNAME") ... ... // De andre 8 felter
Min SP på SQL serveren er bygget op som benny.tordrup beskriver længere oppe, blot med de 9 søgefelter.
Når man submitter min søgeform som det ser ud nu, returneres alle records blot?
Jeg har forsøgt med:
<% Dim spAdvancedSearch__CNAME spAdvancedSearch__CNAME = Request.QueryString("CNAME") if(undefined <> "") then spAdvancedSearch__CNAME = Request("CNAME") ... ... // De andre 8 felter
Men det virker ikke? Den fanger ikke noget fra min string.
I dette forsøg, måtte jeg også lave mit PHONE og ZIPCODE om fra int og numeric til nvarchar i SQL'en, ellers havde den problemer med at konvertere fra min Request.QueryString
Åhh, hvor jeg snakker... :-) Men håber I vil hjælpe, og håber at jeg har forklaret mig.
Min SP virker, sådan som jeg opfatter det. I UltraDev kan man sætte nogle Default values og så teste. Her her jeg forsøgt med f.eks. ZIPCODE 2100 og så får jeg et par records retur. Så dan skulle være OK.
Ja, lige nu ligger problemet i at fange de indtastet værdier fra min søgeform i ASP og hive dem ind til brug i min søgeresultatsides Dim-objekter.
Når man submitter lister den bare alle records, den fanger ikke de indtastede værdier.
benny.tordrup> kan du forklare lidt mere om hvad den SP du har smidt mig gør?
Du siger jeg skal bruge et command objekt til at åbne recordset'et med. Men min SP som du beskriver det, hvad indeholder det recordset?
Jeg på på SQL-serveren testet SP med forskellige søgevariabler med kode som:
exec KOBAdvancedSearchTable @Phone = '88888888'
Og det får jeg en record ud af, så SP burde virke.
Med koden som ovenfor i mit Command objekt og mine Dim objekter, samt rsSearch, får jeg uanset hvad jeg taster i min søgeform alle records ud og vist på min side. Hvis jeg udskriver mine Request.Qurystring, så er de lig attributterne på den første record?
Vrøvler jeg eller er du eller nogen med på hvad der sker?
PS. Min form er simpel. Ni input-felter som sender values afsted mod min resultat side. Det er i resultatsiden det hele sker, form'en er der ikke så meget mystik i.
Den stored procedure,jeg lavede, laver en where-betingelse omfattende alle (i mit tilfælde) tre felter, der søges på. Hvis der ikke overføres noget til parameteren, er den null, og derved opfyldes den sidste halvdel af den enkelte delbetingelse (@Param is null). Hvis det er udfyldt, laves test på første halvdel (Felt like @Param).
Inden select delen bliver udført, er der pillet ved de nvarchar-parametre, der overføres, såfremt de ikke er null. Der bliver sat wildcard ind således, at der kan laves delsøgning (hvor værdien er en del af feltet).
Du skal forresten kun sætte de parametre, hvor der skal en værdi i.
De test, jeg kørte på den stored procedure, returnerede hvad jeg havde forventet.
Jeg har aldrig set ret meget godt komme ud af Ultradev kode. Vi kan vel blive enige om at I begge har konstateret at benny's sp virker som forventet og at årsagen skal findes i ASP koden. Prøv at undgå alle Ultradev's standardværdier og ekstra funktioner og skriv "standard" ASP kode i stedet.
tmceu> Jeg bruger nu engang UD, og ja vi er enig, min SP virker.
Hjælp til standart ASP kodet Command Objekt, eller hjælp til standart ASP kode der Request'er mine værdier fra min Form og sender dem afsted mod min SP, således at jeg får samme resultat i min side som på serveren, er velkommen.
benny.tordrup> din SP virker til dels. Det vil sige den virker men ikke efter min hensigt. Jeg måtte gå helt væk fra SP og Command objekt som du har foreslået.
Måtte finde på helt anden løsning i ASP.
Men tak for hjælpen.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.