webForumDet fria alternativet

Parameter ellr ej i SP

12 svar · 382 visningar · startad av ironhead

ironheadMedlem sedan mars 20011 327 inlägg
#1

Hej!

Hur bör man hantera parametrar i SP:s, om jag inte vet om den kommer att innehålla ett värde eller ej?

Om en parameter inte innehåller nåt värde, kanske man inte vill använda den om man t.ex. använder sig av LIKE i SQL-satsen.

med innehåll i parametern @ord

SELECT test FROM tabell WHERE val=1 AND @ord='%@ord%'

utan innehåll i parametern @ord

SELECT test FROM tabell WHERE val=1
LarsGMedlem sedan dec. 200012 465 inlägg
#2
SELECT test FROM tabell 
WHERE val=1 
AND (ord like '%' + @ord  + '%' or @ord is null)
ironheadMedlem sedan mars 20011 327 inlägg
#3

Tack! Det funkade bra med LIKE, Lars...men hur gör jag om jag skickar in ID:n som jag vill jämföra med....testade:

AND (tType.iTypeID =  @iTypeID or @iTypeID is null)

men då fick jag ingen träff...

LarsGMedlem sedan dec. 200012 465 inlägg
#4

Kan du utveckla det lite mer? Vad innehåller variabeln @iTypeID t.ex?

ironheadMedlem sedan mars 20011 327 inlägg
#5

LarsG skrev:

Kan du utveckla det lite mer? Vad innehåller variabeln @iTypeID t.ex?

@iTypeID innehåller ett ID (siffra), matchas mot räknare + primärnyckel i tabell. Deklareras som Integer i SP:n.

ironheadMedlem sedan mars 20011 327 inlägg
#6
LarsGMedlem sedan dec. 200012 465 inlägg
#7

Jag förstår inte vad problemet är. Exemplifiera med tabellinnehåll och vilket resultat du förväntar dig.

ironheadMedlem sedan mars 20011 327 inlägg
#8

Jag försöker mig på att göra en sökmotor som skall söka på:
maträtt(fritext)
ingredienser(fritext)
ejinnehållaingredienser(fritext)
typ(idnr)
tillfälle(idnr)
måltid(idnr)
tema(fritext)

Jag har alltså 3 fritextrutor där man kan skriva ord och 3 dropdown som baseras på idnr (räknare + primärnyckel)
och dels "tema" som man kan skriva med i url:en för att begränsa antal måltider inom ett eller flera teman.

så min SP ser ut nåt som (pseudokod):

SELECT * FROM tabell LEFT OUTER JOIN....WHERE Publiceringdatum <= '20050308'
AND tema=@tema1 
OR tema=@tema2 
OR tema=@tema3
OR tema=@tema4
OR tema=@tema5

AND thismeal LIKE '%' + @thismeal + '%'
AND ingrediens LIKE '%' + @ingrediens + '%'
AND ingrediens NOT LIKE '%' + @NOTIngrediens + '%'
AND type=@type
AND meal=@meal
AND occasion=@occasion

På ASP-sidan ser jag till att de tema jag skickar in (mellan 1-5) alltid skickas in med början på @tema1 och stigande.

Problemet är att när man bara t.ex. vill söka på ingrediens, så blir det fel iom att de andra värdena är tomma, jag får ett felaktigt resultat.

LarsGMedlem sedan dec. 200012 465 inlägg
#9

Om du skickar in null för de variabler som inte har något värde så

SELECT * FROM tabell LEFT OUTER JOIN....WHERE Publiceringdatum <= '20050308'
AND ((tema = @tema1 or @tema1 is null)
or (tema = @tema2 or @tema2 is null) 
or (tema = @tema3 or @tema3 is null)
or (tema = @tema4 or @tema4 is null)
or (tema = @tema5 or @tema5 is null))
AND (thismeal LIKE '%' + @thismeal + '%' 
   or @thismeal is null)
AND (ingrediens LIKE '%' + @ingrediens + '%'
 or @ingrediens is null)
AND (ingrediens NOT LIKE '%' + @NOTIngrediens + '%'
or @@NOTIngrediens is null)
AND (type=@type or @type is null)
AND (meal=@meal or @meal is null)
AND (occasion=@occasion or @occasion is null)
ironheadMedlem sedan mars 20011 327 inlägg
#10

Vad jag än skriver nu, så får jag noll träffar :-/

Kan man skriva ut frågan på nåt vis, så man ser vad som händer?

ironheadMedlem sedan mars 20011 327 inlägg
#11

red.
Jag har märkt att det är dessa 4 rader som gör att sql-satsen inte fungerar:

AND (ingrediens NOT LIKE '%' + @NOTIngrediens + '%'
or @NOTIngrediens is null)
AND (type=@type or @type is null)
AND (meal=@meal or @meal is null)
AND (occasion=@occasion or @occasion is null)

Använder jag INTE dessa rader, så fungerar sökningen som den ska, vill dock ha med dessa också.

NOTingrediens = fritextfält (varchar)
type, meal, occasion = idnummer (int)

ironheadMedlem sedan mars 20011 327 inlägg
#12

Aaah! Nu löste det sig....kunde inte skicka in '' in i AND (ingrediens NOT LIKE '%' + @NOTIngrediens + '%'
or @NOTIngrediens is null)
utan var tvungen att skicka in '''', och med type, meal, occasion var jag tvungen att skicka in null istället, då funkar det :)

ironheadMedlem sedan mars 20011 327 inlägg
#13

red. Felskrivning...funkar bra nu....tack LarsG! :)

Genererad på 371 ms · cache AV · v20260730165559-full.f96bc7eb