Stored Procedure SELECT met IN en variable

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 14:17
Ik ben bezig om een webapplicatie hier te upgraden naar een nieuwe versie van .net en wat nieuwe functionaliteit toe te voegen.
1 daarvan is het zoeken op kentekens.
Nu gebruikt deze webapplicatie stored procedures en de oude zijn al omgebouwd, nu loop ik alleen vast op het zoeken van kentekens.

Ik defineer in mijn SP een variable
code:
1
@Kenteken as varchar(2500)


En daaronder in 1 van de where clauses zet ik dan het volgende:
code:
1
AND MLM_KENTEKEN IN (@Kenteken)


Echter zodra ik meer dan 1 kenteken invoer dan werkt het niet meer, echter een IN statement wordt naar mijn weten juist gebruikt om een lijst door te lopen.
De input vanuit de webapplicatie is als volgt:
'abcd12','efgh12','ijkl12','mnop12'

Kan iemand mij uitleggen waarom dit niet werkt?
Tevens is het zoeken hierop best lastig, en onze SQL beheerder komt ook al niet verder ermee.
Het betreft hier MSSQL 2012 SP2

Beste antwoord (via tha_crazy op 28-01-2016 14:52)


  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 19-09 16:45

Skinny

DIRECT!

mulder schreef op donderdag 28 januari 2016 @ 09:40:
Jouw lijst is geen lijst maar een tekst, een string. In dit geval wil je dus met CHARINDEX oid zoeken in je @Kenteken.

Kijk ook eens naar LIKE btw, of zorg dat je een lijst van je varchar maakt.
Die CHARINDEX lijkt me in dit geval de makkelijkste oplossing aangezien het 'netjes' gescheiden values met quotes zijn:

code:
1
2
3
select *
FROM table
WHERE ISNULL(CHARINDEX('''' + column+ '''', @kenteken),0) > 0



Tenzij je tabel 'erg groot' (relatief) is want dan is splitsen en zoeken op de gesplitste uitkomst beter (icm index op kenteken kolom in de tabel)

[ Voor 12% gewijzigd door Skinny op 28-01-2016 14:17 ]

SIZE does matter.
"You're go at throttle up!"

Alle reacties


Acties:
  • 0 Henk 'm!

  • Mike78
  • Registratie: September 2000
  • Laatst online: 15:26

Mike78

Always

Dat werkt inderdaad niet zomaar, welke database (sql server, mysql etc )gaat het om?

24 uur per dag, 24 biertjes in een krat. Toeval?


Acties:
  • 0 Henk 'm!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 14:17
Het betreft hier MSSQL 2012 SP2, zal het ook even in de OP toevoegen

[ Voor 4% gewijzigd door tha_crazy op 28-01-2016 09:31 ]


Acties:
  • 0 Henk 'm!

  • Mike78
  • Registratie: September 2000
  • Laatst online: 15:26

Mike78

Always

Ok dat maakt het iets makkelijker.
Je kan dan werken met een table valued parameter.
Voor een voorbeeld kan je hier kijken:
http://stackoverflow.com/...ocedurehow-to-pass-values

[ Voor 30% gewijzigd door Mike78 op 28-01-2016 09:34 ]

24 uur per dag, 24 biertjes in een krat. Toeval?


Acties:
  • 0 Henk 'm!

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 12:38

mulder

ik spuug op het trottoir

Jouw lijst is geen lijst maar een tekst, een string. In dit geval wil je dus met CHARINDEX oid zoeken in je @Kenteken.

Kijk ook eens naar LIKE btw, of zorg dat je een lijst van je varchar maakt.

[ Voor 25% gewijzigd door mulder op 28-01-2016 09:43 ]

oogjes open, snaveltjes dicht


Acties:
  • 0 Henk 'm!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 14:17
Mike78 schreef op donderdag 28 januari 2016 @ 09:33:
Ok dat maakt het iets makkelijker.
Je kan dan werken met een table valued parameter.
Voor een voorbeeld kan je hier kijken:
http://stackoverflow.com/...ocedurehow-to-pass-values
Ik ga hier even induiken, maar moet wel zeggen dat ik geen SQL Expert ben :P
mulder schreef op donderdag 28 januari 2016 @ 09:40:
Jouw lijst is geen lijst maar een tekst, een string. In dit geval wil je dus met CHARINDEX oid zoeken in je @Kenteken.

Kijk ook eens naar LIKE btw, of zorg dat je een lijst van je varchar maakt.
Bij LIKE kan ik als t goed is maar 1 value per keer checken, en dat zou dan betekenen dat ik de SP voor elk kenteken moet afvuren.
Ga ook eens kijken voor een lijst van mn varchar maken.

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 19-09 16:45

Skinny

DIRECT!

mulder schreef op donderdag 28 januari 2016 @ 09:40:
Jouw lijst is geen lijst maar een tekst, een string. In dit geval wil je dus met CHARINDEX oid zoeken in je @Kenteken.

Kijk ook eens naar LIKE btw, of zorg dat je een lijst van je varchar maakt.
Die CHARINDEX lijkt me in dit geval de makkelijkste oplossing aangezien het 'netjes' gescheiden values met quotes zijn:

code:
1
2
3
select *
FROM table
WHERE ISNULL(CHARINDEX('''' + column+ '''', @kenteken),0) > 0



Tenzij je tabel 'erg groot' (relatief) is want dan is splitsen en zoeken op de gesplitste uitkomst beter (icm index op kenteken kolom in de tabel)

[ Voor 12% gewijzigd door Skinny op 28-01-2016 14:17 ]

SIZE does matter.
"You're go at throttle up!"


Acties:
  • 0 Henk 'm!

  • tha_crazy
  • Registratie: Maart 2007
  • Laatst online: 14:17
Skinny schreef op donderdag 28 januari 2016 @ 14:16:
[...]


Die CHARINDEX lijkt me in dit geval de makkelijkste oplossing aangezien het 'netjes' gescheiden values met quotes zijn:

code:
1
2
3
select *
FROM table
WHERE ISNULL(CHARINDEX('''' + column+ '''', @kenteken),0) > 0



Tenzij je tabel 'erg groot' (relatief) is want dan is splitsen en zoeken op de gesplitste uitkomst beter (icm index op kenteken kolom in de tabel)
Na inderdaad even rotzooien met Table Valued Parameters werkt CHARINDEX eigenlijk precies zoals het zou werken zonder al te veel aanpassen!

Acties:
  • 0 Henk 'm!

  • raptorix
  • Registratie: Februari 2000
  • Laatst online: 17-02-2022
Wat ook nog een optie zou zijn, is de kentekens in een temp table te inserten en dan een join op de kentekentable te doen.
Pagina: 1