Toon posts:

[(T-)SQL] Filteren op string-waardes uit Array

Pagina: 1
Acties:

Verwijderd

Topicstarter
Een veel gestelde vraag misschien, ik kon in ieder geval geen antwoord vinden voor mijn versie ervan.

Het probleem is als volgt:

Ik heb een Stored Procedure die een aantal records (zendinggegevens) ophaald uit een tabel, en daarbij filtreerd op Datum en Klant.
Tot nu toe kon de gebruiker daarbij een Klant uit een Combobox (VB.NET) kiezen, en dan werd die als @Klant (varchar(30)) meegegeven aan de stored procedure.

Nu is er van de gebruikers de vraag of ze ook meerdere klanten zouden kunnen selecteren. Hier kom ik bij het probleem, ik kan geen string-array meegeven.

Ik had als idee om één grote varchar mee te geven die dan dient als "comma seperated string". Helaas is mijn kennis van T-SQL nog te beperkt om dit te realiseren.
Nu de vraag dus...
Kan iemand mij op weg helpen om een string van een onbekend aantal comma (of return of tab...) gescheiden waardes (maximaal 10 ofzo) om te zetten in een quotable stukje query

Een andere (betere / makkelijkere / snellere) methode zou overigens ook erg op prijs worden gesteld!

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Het id van de klanten doorgeven als comma separated string:

Hoe je dat doet:
Je maakt een string aan.
Je overloopt de array met alle klanten-id's.
Je gaat het volgende aan je string plakken:
string = string + currentklantid + komma

De laatste komma nog wegdoen en je hebt een komma-separated string.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami: dat stukje heb ik al (sorry, onduidelijk in mijn bovenstaande post)

Het probleem is die komma-seperated string in SQL terug parsen naar iets in de vorm van:

CSV = "IBM,AMD,Oce,Laerdal"

SQL moet worden:
Z.Klant = 'IBM' OR Z.Klant = 'AMD' OR Z.Klant = 'Oce' OR Z.Klant = 'Laerdal'

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Verwijderd schreef op 28 oktober 2002 @ 15:21:
whoami: dat stukje heb ik al (sorry, onduidelijk in mijn bovenstaande post)

Het probleem is die komma-seperated string in SQL terug parsen naar iets in de vorm van:

CSV = "IBM,AMD,Oce,Laerdal"

SQL moet worden:
Z.Klant = 'IBM' OR Z.Klant = 'AMD' OR Z.Klant = 'Oce' OR Z.Klant = 'Laerdal'


code:
1
WHERE klantId IN (1, 12, 45)

* whoami doet het liever met getalletjes, maar je kunt de IN operator gebruiken.

https://fgheysels.github.io/


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Verwijderd schreef op 28 oktober 2002 @ 15:21:
whoami: dat stukje heb ik al (sorry, onduidelijk in mijn bovenstaande post)

Het probleem is die komma-seperated string in SQL terug parsen naar iets in de vorm van:

CSV = "IBM,AMD,Oce,Laerdal"

SQL moet worden:
Z.Klant = 'IBM' OR Z.Klant = 'AMD' OR Z.Klant = 'Oce' OR Z.Klant = 'Laerdal'
Je kunt ipv al die OR's beter IN gebruiken. Dan krijg je dus zoiets:
code:
1
Z.Klant IN ('IBM', 'AMD', 'Oce', 'Laerdal'

Heb je het alleen niet zo begrepen op een dynamische query, dan moet je iets anders doen. Zelf heb ik goede ervaringen met het gebruik van een user defined function die de list uit elkaar trekt en teruggeeft als een table. Het handigst om te implementeren is het als je de list als een varchar meegeeft, maar dan mag de totale lijst niet langer zijn dan 4000 karakters.

[edit]
Dat van die user defined function werkt overigens alleen in MSSQL 2000.

Never underestimate the power of


Verwijderd

Topicstarter
Nogmaals bedankt, whoami, maar ik denk dat je mijn vraag verkeerd begrijpt :?

Het probleem ligt hem in het parsen van de CSV in T-SQL, niet het opzoeken van de waardes, of het genereren van die string.

edit:

WHERE Klant in ('ibm' etc
is inderdaad beter, maar dan moet ik het nog steeds daarnaartoe zien te parsen
Getalletjes zou nog mooier zijn, maar er zit een optie bij voor klanten die nog niet in de tabel voorkomen (overig zeg maar...)

Verwijderd

Topicstarter
cameodski:
kan je een voorbeeld geven van dat uit elkaar trekken en teruggeven als temptable, da's natuurlijk ook erg makkelijk, en langer dan zo'n 500 tekens zal die varchar nooit worden (SoundBastard denkt nog even terug aan Bill G. die ooit zij dat je *NOOIT* meer dan 640 kb nodig zou hebben)

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
Kun je niet zoiets doen:
code:
1
2
3
4
DECLARE  @sqlstr varchar(1024)

set @sqlstr = 'SELECT * FROM tabel WHERE id IN (' + CSVSTRING + ')'
execute (@sqlstr)

https://fgheysels.github.io/


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Je krijgt dan zoiets (de rest kun je vast zelf wel even erbij verzinnen :) ):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE FUNCTION dbo.MyFunction
(
    @myText     varchar(4000)
)
RETURNS @retArray   table
    (
        value   varchar(4000)
    )
AS
BEGIN
-- Parse string



RETURN
END

Never underestimate the power of


Verwijderd

Topicstarter
cameodski schreef op 28 oktober 2002 @ 15:54:
Je krijgt dan zoiets (de rest kun je vast zelf wel even erbij verzinnen :) ):
Dat is nou net het stukje wat ik zoek, maar never mind, ik kom er wel uit met mijn zojuist gevonden boek ("Professional SQL Server 2000 Programming" van Wrox)

  • whoami
  • Registratie: December 2000
  • Laatst online: 19:34
whoami schreef op 28 oktober 2002 @ 15:43:
Kun je niet zoiets doen:
code:
1
2
3
4
DECLARE  @sqlstr varchar(1024)

set @sqlstr = 'SELECT * FROM tabel WHERE id IN (' + CSVSTRING + ')'
execute (@sqlstr)


Bracht dit soelaas of snap ik nog altijd niet wat je precies wilt?

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami: dit dekt de lading, ik heb alleen nog wat troubles met de quoted CSV maken... wat dat betreft ben ik ook meer fan van getalletjes, maar dat moet ik nog even in elkaar prutsen.

Thanks for the help

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Verwijderd schreef op 28 oktober 2002 @ 16:04:
Dat is nou net het stukje wat ik zoek, maar never mind, ik kom er wel uit met mijn zojuist gevonden boek ("Professional SQL Server 2000 Programming" van Wrox)
Sorry, ik kan die split function effe niet vinden. Maar als je naar de volgende functies/keywords bestudeerd, kom je vast een heel eind:
WHILE, IF, LEN, CHARINDEX, SUBSTRING

Never underestimate the power of

Pagina: 1