Toon posts:

[.Net] Array als SQL parameter?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een webservice in .Net 2.0 te ontwikkelen. Daarin heb ik een dataset gemaakt met 2 tabellen. De eerste tabel is gevuld met autouitvoeringen en de tweede met opties die voor de betreffende autouitvoeringen beschikbaar zijn. De gebruiker zal aan de hand van een merk en een type een lijst met uitvoeringen en voor iedere uitvoering een lijst met beschikbare opties terugkrijgen.

Edit: Vergeten te vermelden |:( : de onderliggende DB is SQL Server 2000.

Uit oogpunt van efficientie, wil ik slechts 2 queries draaien: 1 om de uitvoeringentabel te vullen en 1 om de optietabel te vullen. Die tweede query zou prima de volgende vorm kunnen hebben:
SQL:
1
2
SELECT * FROM Optie
WHERE UitvoeringID IN (100, 2313, 937)

De UitvoeringID's zijn natuurlijk veranderlijk, dus zou ik de query als volgt willen maken:
SQL:
1
2
SELECT * FROM Optie
WHERE UitvoeringID IN (@UitvoeringIDs)

Het lijkt er echter sterk op dat dit niet gaat lukken, omdat ik een soort array van integers als parametertype moet meegeven om dit werkend te krijgen. Mijn vraag is: is dit toch mogelijk? Zo ja: hoe? En zo niet: wat zijn de beste alternatieven?

Een alternatief is om de query met stringconcatenatie op te bouwen, maar hierbij verlies je alle voordelen van een parameterized query (o.a. bescherming tegen SQL injection attack, performance). Een ander alternatief is om voor iedere regel uit Uitvoering een losse query te doen op Optie, maar zo kan het aantal queries snel oplopen. Zie ik andere (lees: betere) alternatieven over het hoofd?

NB: Het datamodel en de queries zijn veel ingewikkelder dat bovenstaande query, maar deze versimpelde query is representatief genoeg om het probleem duidelijk te maken.

[ Voor 6% gewijzigd door Verwijderd op 15-09-2006 08:56 . Reden: type DB toegevoegd ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Array's als parameter blijft altijd een beetje een probleem. Ikzelf gebruik meestal een optie als deze. Het is wel afhankelijk van de data die je hebt of deze methode, en bijvoorbeeld meerdere queries uitvoeren de beste keuze is.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • giMoz
  • Registratie: Augustus 2002
  • Laatst online: 21-01 09:10

giMoz

iets met meester...

je zou het als xml bestand mee kunnen geven en in je stp een temp table vullen met de waardes uit dat xml bestand en daar op joinen op je opties eruit te halen..

Of niet natuurlijk...


  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Als je de lijst van integers joined kan je deze dan niet als een parameter meegeven? Het joinen van zo'n lijst van integer is wel een beetje duur maar het zou een oplossing kunnen zijn. Dus niet de lijst direct in de query zetten maar als parameter.

Skill is when luck becomes a habit.


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Je kan idd geen parameters gebruiken met een IN

In dit geval maak ik altijd gebruik van string - concat: een komma-separated string opbouwen mbhv de values die je krijgt. Zo heel veel kan er niet mislopen als je er voor zorgt dat de waardes die je in je string zet, allemaal 'geldig' zijn.

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
giMoz schreef op vrijdag 15 september 2006 @ 08:53:
je zou het als xml bestand mee kunnen geven en in je stp een temp table vullen met de waardes uit dat xml bestand en daar op joinen op je opties eruit te halen..
Ik denk dat de methode van een string met id's ('1,2,4,5,7,8') meegeven minstens zo snel te verwerken zal zijn door SQL Server.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • __fred__
  • Registratie: November 2001
  • Laatst online: 11-02 07:23
Denk er wel even aan dat je alleen char, varchar, nchar en nvarchar parameters kunt megeven aan een procedure en geen text of ntext. Dit limiteert je stringlengte in SQL server 2000 tot 4000(unicode) c.q. 8000(ansi) karakters.

[ Voor 3% gewijzigd door __fred__ op 15-09-2006 10:51 ]


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Je kunt een UDF maken die de string als input heeft en een table variable teruggeeft en de string dus kapotknipt, dan doe je gewoon een select op die table in je IN clause.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • P_de_B
  • Registratie: Juli 2003
  • Niet online

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1