[SQL] kan uitkomst van dynamische count(*) niet ophalen

Pagina: 1
Acties:

  • shades
  • Registratie: September 2001
  • Laatst online: 13-11 09:10
Ik ben bezig met een query die binnen een sp dynamich wordt opgebouwd. Ik heb de query wat vereenvoudigd om deuitleg te vergemakkelijken. Het gaat hier om MSSQL 2000 SP4.

SQL:
1
2
3
4
declare @i int
declare @q varchar(4000)
set @q = '(select count(*) from tblUserProfiles where .......)'
set @i = exec (@q)


Als ik dat uitvoer krijg ik:
code:
1
2
Server: Msg 156, Level 15, State 1, Line 4
Incorrect syntax near the keyword 'exec'.


De bedoeling is op het resultaat van de count(*) in @i te krijgen maar dat kan kennelijk niet op deze manier. Als ik de code iets verander dan krijg ik de fout dat @i niet bestaat. kennelijk wordt een exec als een opzich staand deel uitgevoerd - hoe krijg ik bovenstaande count(*) nu in @i ?? Het is essentieel voor de verdere afhandeling dat dit werkt.

SQL:
1
2
3
4
declare @i int
declare @q varchar(4000)
set @q = '(select @i=count(*) from tblUserProfiles where .......)'
exec (@q)


Kan dit uberhaupt gaan werken ?

[ Voor 4% gewijzigd door shades op 05-03-2007 15:45 ]

https://k1600gt.nl


  • Gé Brander
  • Registratie: September 2001
  • Laatst online: 26-11 17:32

Gé Brander

MS SQL Server

Waarom zou je binnen de sp, de query dynamisch op willen bouwen op deze wijze? Volgens mij kan je veel beter een sp maken die gewoon de query uitvoert en het resultaat teruggeeft.

Vroeger was alles beter... Geniet dan maar van vandaag, morgen is alles nog slechter!


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Gaat het hier over MS SQL Server ?

https://fgheysels.github.io/


  • shades
  • Registratie: September 2001
  • Laatst online: 13-11 09:10
afhankelijk van de opgegeven params moeten er meerdere AND/OR in de where clause gezet worden. Opzich niet spannend want dat dynamisch maken is een eitje. Ik moet echter weten hoeveel rows er in de resultset zitten. Die heb ik nodig voor serverside paging.

https://k1600gt.nl


  • shades
  • Registratie: September 2001
  • Laatst online: 13-11 09:10
whoami schreef op maandag 05 maart 2007 @ 14:35:
Gaat het hier over MS SQL Server ?
Yup
MSSQL 2000 SP4 om precies te zijn...

https://k1600gt.nl


  • Cyphax
  • Registratie: November 2000
  • Laatst online: 12:09

Cyphax

Moderator LNX
shades schreef op maandag 05 maart 2007 @ 14:39:
afhankelijk van de opgegeven params moeten er meerdere AND/OR in de where clause gezet worden. Opzich niet spannend want dat dynamisch maken is een eitje. Ik moet echter weten hoeveel rows er in de resultset zitten. Die heb ik nodig voor serverside paging.
Serverside paging? Met een recordset-object? Daar kun je normaliter ook wel een rowcount uithalen, daar hoef je niet voor met queries te worstelen op deze manier. :)

Saved by the buoyancy of citrus


  • Gé Brander
  • Registratie: September 2001
  • Laatst online: 26-11 17:32

Gé Brander

MS SQL Server

shades schreef op maandag 05 maart 2007 @ 14:39:
afhankelijk van de opgegeven params moeten er meerdere AND/OR in de where clause gezet worden. Opzich niet spannend want dat dynamisch maken is een eitje. Ik moet echter weten hoeveel rows er in de resultset zitten. Die heb ik nodig voor serverside paging.
Dan hoef je nog niet op deze wijze de query dynamisch aan te maken. Je kan gewoon variabelen meegeven met het uitvoeren van de query en dan als output parameter het resultaat teruggeven

Vroeger was alles beter... Geniet dan maar van vandaag, morgen is alles nog slechter!


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Kijk dan eens naar de sp_execute stored procedure; daar kan je nl. ook output parameters aan meegeven.
code:
1
2
3
declare @numberOfRows INT
select @sqlstring = 'SELECT @i = count(1) ... '
EXEC sp_executesql @sqlstring, N'@i INT OUTPUT', @i =@numberOfRows OUTPUT
ps: vermeld in 't vervolg ook in je titel en TS over welk dbms het gaat

https://fgheysels.github.io/


  • shades
  • Registratie: September 2001
  • Laatst online: 13-11 09:10
Cyphax schreef op maandag 05 maart 2007 @ 14:41:
[...]

Serverside paging? Met een recordset-object? Daar kun je normaliter ook wel een rowcount uithalen, daar hoef je niet voor met queries te worstelen op deze manier. :)
Ik heb het helemaal nog niet over een recordset-object gehad. Bij een recordsetobject haal je nog steeds alles naar je appserver. Als je het op de sql doos regels krijg je echt alleen maar je daadwerkelijk opgevraagde page terug alleen moet je wel weten hoeveel je er max hebt. Is ook niet lastig maar wel als je query dynamisch is - ik zou in iedergeval niet weten hoe

https://k1600gt.nl


  • shades
  • Registratie: September 2001
  • Laatst online: 13-11 09:10
whoami schreef op maandag 05 maart 2007 @ 14:44:
Kijk dan eens naar de sp_execute stored procedure; daar kan je nl. ook output parameters aan meegeven.
[code]
declare @numberOfRows INT
select @sqlstring = 'SELECT @i = count(1) ... '
EXEC sp_executesql @sqlstring, N'@i INT OUTPUT', @i =@numberOfRows OUTPUT
wow... die kende ik niet - gebruik standaard execute maar ik lees het in de books online dat sp_executesql eigenlijk veel beter is.
ps: vermeld in 't vervolg ook in je titel en TS over welk dbms het gaat
Soz... had eigelijk TSQL willen vermelden maar ik had 'em al verstuurd

https://k1600gt.nl


  • Cyphax
  • Registratie: November 2000
  • Laatst online: 12:09

Cyphax

Moderator LNX
shades schreef op maandag 05 maart 2007 @ 14:47:

Ik heb het helemaal nog niet over een recordset-object gehad. Bij een recordsetobject haal je nog steeds alles naar je appserver. Als je het op de sql doos regels krijg je echt alleen maar je daadwerkelijk opgevraagde page terug alleen moet je wel weten hoeveel je er max hebt. Is ook niet lastig maar wel als je query dynamisch is - ik zou in iedergeval niet weten hoe
Ah, ik ging even uit van dezelfde situatie als hier, database- en webservers op dezelfde machine, serverside paging maar dan anders als bij jou dus. :)

Saved by the buoyancy of citrus


  • shades
  • Registratie: September 2001
  • Laatst online: 13-11 09:10
Cyphax schreef op maandag 05 maart 2007 @ 15:05:
[...]

Ah, ik ging even uit van dezelfde situatie als hier, database- en webservers op dezelfde machine, serverside paging maar dan anders als bij jou dus. :)
voor kleine omgevingen zou dat gaan maar ik zet apps en sql al heel snel appart.

https://k1600gt.nl


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

shades, als je als laatste reageert zou je dan ook de Afbeeldingslocatie: http://gathering.tweakers.net/global/templates/tweakers/images/icons/edit.gif knop kunnen gebruiken als je iets nieuws wilt toevoegen. Anders komt je post over als onnodig kicken binnen 24 uur! :)

[ Voor 19% gewijzigd door BtM909 op 05-03-2007 15:16 ]

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
shades schreef op maandag 05 maart 2007 @ 14:29:
Ik ben bezig met een query die binnen een sp dynamich wordt opgebouwd. Ik heb de query wat vereenvoudigd om deuitleg te vergemakkelijken. Het gaat hier om MSSQL 2000 SP4.

SQL:
1
2
3
4
declare @i int
declare @q varchar(4000)
set @q = '(select @i=count(*) from tblUserProfiles where .......)'
exec (@q)


Kan dit uberhaupt gaan werken ?
waarom doe je niet gewoon dit:
SQL:
1
2
declare @i int
select @i=count(*) from tblUserProfiles where .......

[ Voor 35% gewijzigd door P.O. Box op 05-03-2007 22:49 ]


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Omdat die where dus dynamisch wordt opgebouwd. (yuck -- maar dat terzijde ;))

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
oh ok... had ik weer niet goed gelezen... excuus...
Pagina: 1