[MSSQL.SP] Hoe WHERE IN te gebruiken

Pagina: 1
Acties:

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 27-08 12:42
Op een ASP.NET pagina het ik een aantal checkboxen met de zelfde naam. Als er een aantal checkboxes gechecked zijn, dan krijg ik bij de post een string of array (weet niet precies hoe ASP.NET dat doorgeeft).

Als ik even deze simpel aan een labeltje bind, krijg ik de ID's terug van de geselecteerde items...

Bijvoorbeeld: 34,64,14

Nu wil ik deze naar een stored procedure sturen zodat ik alleen de geselecteerde records terug krijg. om daar dan enkele bewerkingen mee te doen.

Maar hoe kan ik dat nu het beste in een SP stoppen?

nu probeer ik dus

code:
1
2
3
4
5
6
7
8
9
CREATE STORED PROCEDURE getSelectedItems
(
       @selectedItemIDs  int
)
AS
   SELECT * 
   FROM tafel
   WHERE ItemID IN (@selectedItemIDs)
RETURN


Hij geeft iig geen syntax errors, maar als ik de SP probeer te runnen dan krijg ik een type error...Logisch eigenlijk, want @selectedItemIDs heeft de waarde 34,64,14.

Maar als ik er een String van maak, krijg ik ook geen resultaat want @selectedItemIDs krijgt dan de waarde '34,64,14' en daar heb ik ook weinig aan...Hoe kan ik dit oplossen?

Verwijderd

heb hier ff geen mssql bij de hand maar als ik me niet vergis is er een sp_execute of een exec command welke je een string mee kan geven..

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 27-08 12:42
Verwijderd schreef op 03 november 2002 @ 16:58:
heb hier ff geen mssql bij de hand maar als ik me niet vergis is er een sp_execute of een exec command welke je een string mee kan geven..
En hoe moet ik dat dan doen? Moet ik een custom datatype gaan maken dan ofzo?
Zou je een voorbeeldje kunnen geven?

Verwijderd

Je kan EXEC wel gebruiken, maar dan krijg je geen recordset terug.
Ik ben ook aan het puzzelen geweest met een dergelijk probleem, uiteindelijk heb ik de SP gedumpt en in code (VB in mijn geval) de SELECT opgebouwd.

Verwijderd

euhh je hebt 'n handleiding bij je mssql zitten lees die es voor de grap? (ik heb al aangegeven waar je +- op moet zoeken!) 't is natuurlijk wel de bedoeling dat 't je 't een en ander zelf uit zoekt zinloos voorkauwen doen we niet aan hier..

Verwijderd

Verwijderd schreef op 03 november 2002 @ 17:09:
Je kan EXEC wel gebruiken, maar dan krijg je geen recordset terug.
Ik ben ook aan het puzzelen geweest met een dergelijk probleem, uiteindelijk heb ik de SP gedumpt en in code (VB in mijn geval) de SELECT opgebouwd.
Waarom zou je geen recordset terug krijgen? :?

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 27-08 12:42
Sorry, maar volgens mij heb ik een heel ander beeld van EXEC wat een afkorting is van EXECUTE

Ik heb in de SQL-Transact Reference gekeken, en dat heeft het volgende over EXECUTE te vertellen:
Executes a scalar-valued, user-defined function, a system procedure, a user-defined stored procedure, or an extended stored procedure. Also supports the execution of a character string within a Transact-SQL batch.

To invoke a function, use the syntax described for EXECUTE stored_procedure.
Volgens mij moet ik dus de character string methode gebruiken, maar de beschrijveing van MSDN is op dat punt nogal cryptish
Execute a character string:

EXEC [ UTE ] ( { @string_variable | [ N ] 'tsql_string' } [ + ...n ] )
Ik heb al verschillende datatypen geprobeerd, maar ik krijg bij alle geen recordset of een foutmelding terug...

  • ArtyShock
  • Registratie: Juli 2002
  • Laatst online: 21-06 02:54
Er zijn verschillende mogelijkheden om het probleem aan te pakken.
Een aantal opties:

* Voor elke aparte ID een stored procedure uitvoeren. Weet niet of het wenselijk is, maar dan kun je met standaard SQL toe.

* De ID's doorgeven zoals je nu doet, maar dan moet in de stored procedure je string met ID's uitgekleed worden in aparte waarden. Voor elke aparte waarde kan dan vervolgens een query gedaan worden. Eventueel kun je in de stored procedure nog regelen of je alles in aparte recordsets teruggeeft of alle waarden in een recordset.

MS SQL (T-SQL) biedt je de string functies om dit alles te implementeren dus daar hoeft het niet aan te liggen. Het vergt alleen enig grasduinen in MSDN.

Dit alles is gebasseerd op kennis mbt. 'gewoon' ASP maar dat doet wat betreft de query's niets af ten opzichte van ASP.NET en ADO.NET.

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 28-08 19:27

Crazy D

I think we should take a look.

sp_executesql
is hier al behoorlijk vaak langsgekomen, en anders kan je helpfile (Books Online) je beter dan ik alle details uitleggen :)
(en ja je krijgt gewoon een recordset terug)

[edit]
ik zie dat ik wat traag was...

voorbeeldje dan maar

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE STORED PROCEDURE getSelectedItems
(
       @selectedItemIDs  varchar(100)
)
AS

declare @sql nvarchar(200) /* of hoe groot ie moet zijn */

set @sql = ' SELECT * 
   FROM tafel
   WHERE ItemID IN (' + @selectedItemIDs + ')'

execute sp_executesql @sql

(Query analzyer met z'n leuke kleurtjes is toch makkelijker om een query te typen :))

/me slaapt zeker nog een beetje

Als parameter van de stored proc gebruik ik in zo'n geval een varchar, ik zorg bij het aanroepen dat de id's al netjes komma gescheiden zijn dat ik m zo rechtstreeks de query in kan proppen. Misschien niet de perfecte manier maar werkt prima :)

Exact expert nodig?


  • ArtyShock
  • Registratie: Juli 2002
  • Laatst online: 21-06 02:54
Wat in het kort met die beschrijving van EXECUTE bedoeld wordt is dat je met EXECUTE:
* systeem functies uit kunt voeren,
* systeem stored procedures uit kunt voeren,
* eigen stored procedures uit kunt voeren,
* SQL commando's opgebouwd als string tekst uit kunt voeren.

Jij wil graag de derde optie, nu alleen de stored procedure nog ;)

---
De oplossing van Crazy_D is technisch gezien misschien niet de mooiste, maar wel het meest simpel om te implementeren en terug te lezen... So, go with that.

[ Voor 0% gewijzigd door ArtyShock op 03-11-2002 17:46 . Reden: lijkt me duidelijk... ]


  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 27-08 12:42
Crazy_D schreef op 03 november 2002 @ 17:30:
sp_executesql
is hier al behoorlijk vaak langsgekomen, en anders kan je helpfile (Books Online) je beter dan ik alle details uitleggen :)
(en ja je krijgt gewoon een recordset terug)

[edit]
ik zie dat ik wat traag was...

voorbeeldje dan maar

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE STORED PROCEDURE getSelectedItems
(
       @selectedItemIDs  varchar(100)
)
AS

declare @sql nvarchar(200) /* of hoe groot ie moet zijn */

set @sql = ' SELECT * 
   FROM tafel
   WHERE ItemID IN (' + @selectedItemIDs + ')'

execute sp_executesql @sql

(Query analzyer met z'n leuke kleurtjes is toch makkelijker om een query te typen :))

/me slaapt zeker nog een beetje

Als parameter van de stored proc gebruik ik in zo'n geval een varchar, ik zorg bij het aanroepen dat de id's al netjes komma gescheiden zijn dat ik m zo rechtstreeks de query in kan proppen. Misschien niet de perfecte manier maar werkt prima :)
This one did it! Kreeg eerst een fout omdat ik de selecteditemid op int had staan...Die op varchar(100) gezet en toen werkte het als een zonnetje :)

Zie trouwens dat je je zelf al hebt verbeterd :)

  • robjanssen
  • Registratie: September 2001
  • Laatst online: 02-08 16:10

robjanssen

Software Developer

Volgens mij gaat die van Crazy_D niet werken.
ItemID is toch een INT en geen VARCHAR?

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 27-08 12:42
robjanssen schreef op 03 november 2002 @ 17:51:
Volgens mij gaat die van Crazy_D niet werken.
ItemID is toch een INT en geen VARCHAR?
works like a charm...
De variabelen in een SP zijn niet gebonden aan het datatype van een table.

het declaren van datatypen in een SP is om in de normale gang van zaken, syntax errors te voorkomen zodat een string ook echt als string wordt gezien...

Hier maak ik graag een uitzondering :)
Pagina: 1