02. april 2004 - 20:47Der er
6 kommentarer og 1 løsning
optimering a query
Jeg har en SP til at checke kodeord/password, men jeg har to username/password tabeller som personen kan være oprettet i. Lige nu ser min SP sådan her ud:
CREATE PROCEDURE checkCredentials (@CustomerEmail varchar(30), @CustomerPassword varchar(20)) AS IF(SELECT count(*) AS 'CredentialCheckCount' FROM tblCustomers WHERE CustomerEmail1=@CustomerEmail AND CustomerPassword=@CustomerPassword)=0 SELECT count(*) AS 'CredentialCheckCount' FROM tblBugHandlers WHERE BugHandlerEmail=@CustomerEmail AND BugHandlerPassword=@CustomerPassword ELSE SELECT count(*) AS 'CredentialCheckCount' FROM tblCustomers WHERE CustomerEmail1=@CustomerEmail AND CustomerPassword=@CustomerPassword GO
Jeg gad godt at returnere true eller false hvis personen er fundet i en af tabellerne, og også gerne have en måde kun at lave 2 forespørgelser i stedet for mine 3 lige nu.
create procedure checkcredentials ( checkCredentials (@CustomerEmail varchar(30), @CustomerPassword varchar(20)) ) as begin select count(*) as CredentialCheckCount from tblCustomers where CustomerEmail1=@CustomerEmail AND CustomerPassword=@CustomerPassword union all select count(*) from tblBugHandlers where CustomerEmail1=@CustomerEmail AND CustomerPassword=@CustomerPassword end
Ved nærmere eftertanke - måske dette er bedre: Nu burde den kun returnere et record med 1 tal såfremt password matcher.
create procedure checkcredentials ( checkCredentials (@CustomerEmail varchar(30), @CustomerPassword varchar(20)) ) as begin select 1 as CredentialCheck from tblCustomers where CustomerEmail1=@CustomerEmail AND CustomerPassword=@CustomerPassword union select 1 from tblBugHandlers where CustomerEmail1=@CustomerEmail AND CustomerPassword=@CustomerPassword end
Har først lige haft tid til at teste dine forslag, de gør faktisk ikke helt hvad jeg vil have. Min originale SP returnere én række som er 1 hvis godkendt eller 0 hvis ikke.
Dit første forslag returnere to rækker hvor en af dem er 1 hvis godkendt, dit andet forslag returnere én række men ingenting hvis nægtet og 1 hvis godkendt.. Ville gerne have det til 0 ved nægtet adgang da jeg ikke har mulighed for at ændre min kode der benytter denne procedure.
Ok, prøv at lege med denne - jeg har ikke testet noget.
create procedure checkcredentials ( checkCredentials (@CustomerEmail varchar(30), @CustomerPassword varchar(20)) ) as begin select isnull(credentialcheck,0) as credentialcheck from ( select 1 as CredentialCheck from tblCustomers where CustomerEmail1=@CustomerEmail AND CustomerPassword=@CustomerPassword union select 1 from tblBugHandlers where CustomerEmail1=@CustomerEmail AND CustomerPassword=@CustomerPassword ) end
gad godt at den query analyzer kunne fortælle mig lidt mere når der er fejl. Lige nu siger den bare "Incorrect syntax near the keyword 'end'." efter jeg har lavet lidt om på den (den fatter intet af den måde du starter proceduren på, copy/paste fejl?)
den omskrevet ser sådan ud nu:
create procedure checkcredentials2 (@CustomerEmail varchar(30), @CustomerPassword varchar(20)) as begin select isnull(CredentialCheck,0) as CredentialCheck from ( select 1 as CredentialCheck from tblCustomers where CustomerEmail1=@CustomerEmail AND CustomerPassword=@CustomerPassword union select 1 from tblBugHandlers where BugHandlerEmail=@CustomerEmail AND BugHandlerPassword=@CustomerPassword ) end
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.