Avatar billede crazykiddo Nybegynder
30. juni 2003 - 17:31 Der er 16 kommentarer og
3 løsninger

Søge funktion med stored prodecures

Ja men jeg skal have lavet en søgning (altså funktionen) som bruger stored prodecures.
Jeg har rodet med det og kigget på det..men kan ikke helt gennemskue hvordan det skal gøres.

Eks.
Jeg har en tabel som hedder bruger
hvor der er id, navn, alder.

og der er 2 søge felter 1 med navn og en med alder og man ska kunne søge på ab (så den kommer med navne som starter med ab feks.

Men hvordan skal den stored prodecure se ud og hvordan skal det hele sammen sættes..jeg er lost.
Avatar billede arne_v Ekspert
30. juni 2003 - 19:02 #1
Noget i stil med:

CREATE PROCEDURE sp_my_select
    @value AS VARCHAR(255)
AS

SELECT * FROM tabel WHERE felt LIKE @value

som kan kaldes som:

sp_my_select 'ab%'
Avatar billede terry Ekspert
30. juni 2003 - 19:03 #2
CREATE PROCEDURE spFind (@navn varchar(50), @alder integer)
AS

SELECT * FROM bruger WHERE navn = IsNull(@navn, navn) AND alder = IsNull(@alder, alder)
Avatar billede terry Ekspert
30. juni 2003 - 19:04 #3
do you want to be able to searchon "alder" also?

SELECT * FROM bruger WHERE navn LIKE IsNull(@navn, navn) AND alder = IsNull(@alder, alder)
Avatar billede terry Ekspert
30. juni 2003 - 19:05 #4
In the exampe you can enter zero, one or both fields and it should give you a result
Avatar billede terry Ekspert
30. juni 2003 - 19:09 #5
Little error there

SELECT * FROM bruger WHERE navn LIKE IsNull(@navn, navn) + '%'  AND alder = IsNull(@alder, alder)
Avatar billede janus_007 Nybegynder
30. juni 2003 - 19:33 #6
hov arne-> pas på med den sp, den tvinger mssql til at kigge efter en system sp.
Bedre udfra performance at kalde den usp (user_sp) eller noget lign :O). Bare et råd *S*
Avatar billede crazykiddo Nybegynder
30. juni 2003 - 22:13 #7
Okay.. fatter lidt mere nu.. hvad så hvis jeg skal have paging i relsutaterne.. det drejer sig om en meget stor database med ca 600.000 forskellige records i..
(den procedure før var bare et eks)
min procedure ser sådan ud nu:

CREATE PROCEDURE dbo.sp_quicksearch
    (
    @Page int,
    @RecsPerPage int
    )
AS

-- We don't want to return the # of rows inserted
-- into our temporary table, so turn NOCOUNT ON
SET NOCOUNT ON


--Create a temporary table
CREATE TABLE #qsearchtemp
(
    id int IDENTITY,
    firmanavn char (255),
    firmanavn2 char (255),
    adresse char (255),
    adresse2 char (255),
    city char (255),
    postnr char (255),
    tlf char (255),
    fax char (255),
    mobil char (255),
    www char (255),
    email char (255),
    searchord char (255),
    klik int,
    branche1 int,
    branche2 int,
    branche3 int,
    branche4 int,
    branche5 int,
    branche6 int,
    branche7 int,
    branche8 int,
    branche9 int,
    branche10 int,
    area1 int,
    area2 int,
    area3 int,
    area4 int,
    area5 int,
    area6 int,
    area7 int,
    area8 int,
    area9 int,
    area10 int,
    vbeskrivelse char (255),
    logopic char (255),
    solgtaf char (255),
    salgsdato char (255),
    sidstopdateret char (255),
    sidstopdateretaf char (255),
    kommentar char (255),
    CVR char (255),
    SE char (255),
    firmatype char (255),
    etayear char (255),
    addon int,
)

-- Insert the rows from tblItems into the temp. table
INSERT INTO #qsearchtemp (firmanavn, adresse, city, postnr, tlf, fax, mobil, www, email, searchord, klik, branche1, branche2, branche3, branche4, branche5, branche6, branche7, branche8, branche9, branche10, vbeskrivelse, logopic, solgtaf, salgsdato, sidstopdateret, sidstopdateretaf, kommentar, CVR, SE, firmatype, etayear, addon, area1, area2, area3, area4, area5, area6, area7, area8, area9, area10)
SELECT firmanavn, adresse, city, postnr, tlf, fax, mobil, www, email, searchord, klik, branche1, branche2, branche3, branche4, branche5, branche6, branche7, branche8, branche9, branche10, vbeskrivelse, logopic, solgtaf, salgsdato, sidstopdateret, sidstopdateretaf, kommentar, CVR, SE, firmatype, etayear, addon, area1, area2, area3, area4, area5, area6, area7, area8, area9, area10 FROM edb_firmaer ORDER BY firmanavn desc


-- Find out the first and last record we want
DECLARE @FirstRec int, @LastRec int
SELECT @FirstRec = (@Page - 1) * @RecsPerPage
SELECT @LastRec = (@Page * @RecsPerPage + 1)

-- Now, return the set of paged records, plus, an indiciation of we
-- have more records or not!
SELECT *,
      MoreRecords =
    (
    SELECT COUNT(*)
    FROM #qsearchtemp TI
    WHERE TI.ID >= @LastRec
    )
FROM #qsearchtemp
WHERE ID > @FirstRec AND ID < @LastRec


-- Turn NOCOUNT back OFF
SET NOCOUNT OFF
GO

men denne henter bare alt data og sender det ud..hvordan skal jeg lave det hvis der skal være input fra forms og output skal være med paging.
Sorry da jeg er newbie til SP (ikke til asp og sql..men er mest kendt i mysql)
den som hjælper mig med at løse dette kan få alle de point man kan give.
Avatar billede crazykiddo Nybegynder
30. juni 2003 - 22:15 #8
skal den lave en temp eller kan man gøre det på en anden måde? hvis nogle har lyst til at hjælpe mig over icq/msn så sig til..
Avatar billede janus_007 Nybegynder
30. juni 2003 - 23:50 #9
Lidt atypisk måde at gøre det på men ok :O)..., ingen grund til at create table i mssql :O), det er der en anden måde at gøre på

declare @ncount int
IF NOT EXISTS(SELECT TOP 1 * FROM #qsearchtemp)
begin
SELECT * INTO #qsearchtemp FROM edb_firmaer WHERE 1 = 2
INSERT INTO #qsearchtemp FROM edb_firmaer WHERE field1 LIKE 'ab%' ORDER BY firmanavn
set @ncount = @@rowcount
ALTER TABLE #qsearchtemp ADD id INT IDENTITY(1,1)
end

Herefter kan du begynde din paging:

-- Find out the first and last record we want
DECLARE @FirstRec int, @LastRec int
SELECT @FirstRec = (@Page - 1) * @RecsPerPage
SELECT @LastRec = (@Page * @RecsPerPage + 1)

-- Now, return the set of paged records, plus, an indiciation of we
-- have more records or not!
SELECT *, @ncount - @LastRec AS morerecords
FROM #qsearchtemp
WHERE ID > @FirstRec AND ID < @LastRec

Der er sføli en masse der skal tilpasses, eks.vis jeg har bare taget en grov if not exists og en dum like til where clause. Du burde nok overveje en mere opdelt procedure, evt. først lave dit table med søgekriteriet i. opret denne i tempdb (navngivet med user sessionsid). Evt. som where clause eksperimenter lidt med fulltextindexing... men det er noget du kan lave senere, hvis du vil have det til at køre hurtigere.
Avatar billede janus_007 Nybegynder
02. juli 2003 - 10:29 #10
Har du fundet ud af det ??
Avatar billede crazykiddo Nybegynder
07. juli 2003 - 10:37 #11
nej.
Janus jeg forstår ikke lige din sidste der..
Hvorfor er det dumt at lave en temp db ? kan man gøre det på andre måde.. man skal kunne søge på forskellige ting og så skal paging virke..
Avatar billede janus_007 Nybegynder
07. juli 2003 - 11:07 #12
Jeg sagde ikke det var dumt!, hvis du synes at det skal gøres sådan så er løsningen fin nok, men der er mange andre måder at gøre det på. Om de så er bedre eller dårligere, det kommer lidt an på ens scenario :O)
Avatar billede crazykiddo Nybegynder
07. juli 2003 - 11:32 #13
nej nej jamen jeg er nyt til SPer så ved ikke hvad der er bedst osv.
Men kan ikke rigtig får det til at funke..har den SP som jeg skrev..og den virker fint..med paging osv..men hvordan får jeg input ind i den..så den ikke viser alle records..hvordan skal SPen se ud så..og hvordan skal exec være fra aspen.
Avatar billede janus_007 Nybegynder
07. juli 2003 - 13:36 #14
Brug den paging der er indbygget i ADO'en istedet og vent med sådan en sp til du har mere styr på det :O)
Avatar billede crazykiddo Nybegynder
07. juli 2003 - 14:15 #15
Okay men hvordan funker den ? jeg har lavet en i den gamle søgefunktion jeg har lavet (med mysql) men den virker ikke ved mssql.. sorry jeg spørger dumt..jeg er ved at gå kold i det hehe.
Avatar billede janus_007 Nybegynder
07. juli 2003 - 23:04 #16
Har du prøvet den sp jeg har lavet ??, og hvis ja, hvilke fejl oplevede du?
Avatar billede crazykiddo Nybegynder
08. juli 2003 - 16:06 #17
Janus_007 din sp giver ingen mening og er rodet syntes jeg..
terry jeg brugte din : SELECT * FROM bruger WHERE navn LIKE IsNull(@navn, navn) + '%'  AND alder = IsNull(@alder, alder)
men hvad gør IsNull ? og hvad bruges IsNull(@bla, det der kommer her til ?)
Avatar billede arne_v Ekspert
08. juli 2003 - 16:15 #18
IsNull(a,b) returnerer a hvis a er forskellig fra NULL og b hvis a er NULL.

alder = IsNull(@alder, alder)

betyder derfor:
  alder angivet som argument til => @alder ikke NULL => man tester om alder matcher det angivne
  alder ikke angivet som argument => @alder NULL => man tester om alder=alder (altid true)

Det kan diskuteres om det er letlæseligt men det har en ønskelig effekt.
Avatar billede crazykiddo Nybegynder
08. juli 2003 - 16:54 #19
Okay..
det er i stedet for at skulle lave en if navn = "" then bla bla osv.
Jamen jeg siger tak. du får lidt lidt point gør du
og janus_007 får osse lidt 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