Avatar billede quercus Nybegynder
05. august 2002 - 17:20 Der 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.

Er der ikke en lettere måde, og i såfald hvilken?

-quercus
Avatar billede tmceu Praktikant
05. august 2002 - 17:29 #1
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.
Avatar billede _just4fun_ Nybegynder
05. august 2002 - 17:38 #2
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!
Avatar billede tmceu Praktikant
05. august 2002 - 17:39 #3
Tak for lektionen :-)
Avatar billede quercus Nybegynder
05. august 2002 - 17:46 #4
just4fun> Også tak herfra, for lektionen :-)

tmceu> Yes, jeg kan se idéen. Forsøger mig lidt og vender så tilbage.
Avatar billede bennytordrup Nybegynder
05. august 2002 - 23:39 #5
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.
Avatar billede bennytordrup Nybegynder
05. august 2002 - 23:40 #6
Du skal selvfølgelig bruge et command objekt i APS-koden til at åbne recordsettet med.
Avatar billede bennytordrup Nybegynder
06. august 2002 - 08:20 #7
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.
Avatar billede quercus Nybegynder
07. august 2002 - 00:20 #8
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?
Avatar billede quercus Nybegynder
07. august 2002 - 01:55 #9
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??

Er jeg på rette spor?
Avatar billede bennytordrup Nybegynder
07. august 2002 - 08:34 #10
Har du index på de felter, du vil kunne søge på? Evt. et, hvor alle ni felter indgår. Index kan bringe forespørgselstiden gevaldigt ned.

Prøv evt. om du kan justere på time out tiderne.
Avatar billede tmceu Praktikant
07. august 2002 - 09:11 #11
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.
Avatar billede bennytordrup Nybegynder
07. august 2002 - 09:15 #12
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.
Avatar billede _just4fun_ Nybegynder
07. august 2002 - 09:22 #13
Hvor gang tid tager udsøgningen, og hvordan ser Accounts-tabellen ud?
Avatar billede tmceu Praktikant
07. august 2002 - 09:23 #14
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.
Avatar billede quercus Nybegynder
07. august 2002 - 11:38 #15
OK, for at udelukke alt det her med index, timeout mv. har jeg taget 200 records over i en test_tabel.

Nu går det også bedre fra UD og jeg har fået styr på mit Command object.

Mit Command object ser sådan ud (har klippet lidt i det):

<%
set spAdvancedSearch = Server.CreateObject("ADODB.Command")
spAdvancedSearch.ActiveConnection = MM_ir_STRING
spAdvancedSearch.CommandText = "dbo.AdvancedSearchTable"
spAdvancedSearch.Parameters.Append spAdvancedSearch.CreateParameter("@RETURN_VALUE", 3, 4)
spAdvancedSearch.Parameters.Append spAdvancedSearch.CreateParameter("@CNAME", 130, 1,255,spAdvancedSearch__CNAME)
...
//De andre 7 søgefelter
...
spAdvancedSearch.Parameters.Append spAdvancedSearch.CreateParameter("@CAREA", 130, 1,255,spAdvancedSearch__CAREA)
spAdvancedSearch.CommandType = 4
spAdvancedSearch.CommandTimeout = 0
spAdvancedSearch.Prepared = true
set rsSearch = spAdvancedSearch.Execute
rsSearch_numRows = 0
%>

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.
Avatar billede bennytordrup Nybegynder
07. august 2002 - 11:45 #16
Hvad er undefined? Og hvad indeholder den
Avatar billede quercus Nybegynder
07. august 2002 - 11:58 #17
undskyld :-(

De to steder der står undefined skulle der have stået:

if(Request("CNAME") <> "")
Avatar billede bennytordrup Nybegynder
07. august 2002 - 12:05 #18
Virker din stored procedure?

Som jeg læser det, så ligger problemet lige nu i at få overført evt. værdier til Command-objektet fra ASP.

Ligger der værdier i Request("CNAME")?
Avatar billede quercus Nybegynder
07. august 2002 - 12:11 #19
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.
Avatar billede bennytordrup Nybegynder
07. august 2002 - 12:39 #20
Jeg har ikke så gevaldig meget styr på ASP, men prøv at poste koden på den form, der skal submitte
Avatar billede quercus Nybegynder
07. august 2002 - 21:32 #21
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?
Avatar billede quercus Nybegynder
07. august 2002 - 21:34 #22
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.
Avatar billede bennytordrup Nybegynder
08. august 2002 - 00:31 #23
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.
Avatar billede tmceu Praktikant
08. august 2002 - 09:00 #24
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.
Avatar billede quercus Nybegynder
08. august 2002 - 12:28 #25
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.
Avatar billede bennytordrup Nybegynder
02. september 2002 - 13:14 #26
Hvis min stored procedure fungerer, så bør du IMHO lukke spørgsmålet her og flytte hjælpen omkring ASP til en relevant gruppe.
Avatar billede quercus Nybegynder
02. september 2002 - 16:26 #27
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester