[SQL] foutafhandeling in stored proc geeft een andere fout

Pagina: 1
Acties:

  • shades
  • Registratie: September 2001
  • Laatst online: 19-05 08:57
Hallo ik heb de volgende stored procedure (sql2000)
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
CREATE   PROCEDURE [dbo].[homepage_fetch_block_content]

   @block_id int 

AS

   declare @block_table varchar(50)
   declare @block_id_field varchar(15)
   declare @block_name_field varchar(20)

   if @block_id > 0
      begin
         
         set @block_table = (select [block_table] from homepage_blocks where block_id = @block_id)

         if @block_table <> ''
         begin
            set @block_id_field = (select [block_id_field] from homepage_blocks where block_id = @block_id)
            set @block_name_field = (select [block_name_field] from homepage_blocks where block_id = @block_id)
            exec ('select b.block_id, ' + @block_id_field + ' as name_id,' + @block_name_field + -->
            <-- ' as name from homepage_blocks as b, ' + @block_table + ' where block_id = ' + @block_id)
         end
         else
         
         begin
            return
         end
      end

   else
   
      begin
         return
      end


GO


Wat moet het doen:
Ik geen een id op, in regel 11 wordt gekeken of het opgegeven id groter is dan 0, indien dit nul (0) of kleiner dan wordt de sp verlaten en blijft de recordset dus leeg.
Daarna wordt in regl 14 gekeken van welke tabel er gegevens moeten worden gehaald. Dit is een doodnormale qry en indien block_id bestaat wordt @blcok_table gevult maar als die niet bestand dan is deze '' (leeg - althans, dat denk ik). Nu check is daar dus op maar als het block_id niet bestaat en @block_table leeg blijft krijg ik de volgende fout:

In sql200 qry-analyzer:
Server: Msg 156, Level 15, State 1, Line 1
Incorrect syntax near the keyword 'as'.

Runtime in vb6:
Run-time error '-2147217900 (80040e14)'
Incorrect syntax near the keyword 'as' (vlakbij regel 5)

Ik heb geen idee wat ik fout doe..
Kan iemand met meer verstand van sql hier misschien een licht op werpen ? Zolang block_id bestaat gaat het dus goed.. (excusses voor vergalde lay-out)

[ Voor 9% gewijzigd door shades op 09-12-2003 22:30 ]

https://k1600gt.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Even een algemene opmerking:

Waarom schrijf je 2x ELSE blokken, als die ELSE eigenlijk niets doet? Behalve RETURNEN dan.
Ik denk dat je op regel 16 niet moet testen als block_table <> '', maar dat je moet checken als block_table verschillend is van NULL.
Je doet 2x dezelfde query, terwijl je die ook in 1x kan doen (regel 18 en 19):
code:
1
SELECT @block_id_field = block_id_field, @block_name_field = block_name_field FROM ....

Wat de bedoeling is van regel 20 snap ik niet zo goed.

Je krijgt je (syntax) error trouwens gewoon omdat je geen haken gezet hebt rond je parameter list:
code:
1
2
3
4
5
CREATE PROCEDURE myProcedure ( @block_id INT )
AS
BEGIN
....
END

https://fgheysels.github.io/


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Zet voor de gein eens wat print @var statements in je sproc en voer deze uit in de QA. Misschien dat je dan wat meer info krijgt. Het lijkt er een beetje op dat een van de queries waar je velden worden opgehaald fout lopen (de uiteindelijke query die je via EXEC uitvoert kan je dus ook met print bekijken).

tip: om de layout beter te krijgen kan je gewoon op een nieuwe regel beginnen.
bijv. dit is gewoon valide t-sql
SQL:
1
2
3
DECLARE @s VARCHAR(100)
SET @s = 'dit is '
       + 'een varcharretje'
whoami schreef op 09 december 2003 @ 23:09:
Je krijgt je (syntax) error trouwens gewoon omdat je geen haken gezet hebt rond je parameter list:
De haakjes zijn niet verplicht.

[ Voor 25% gewijzigd door Annie op 09-12-2003 23:27 ]

Today's subliminal thought is:


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Waarom doe je trouwens geen SELECT COUNT() om na te gaan of er wel degelijk records zijn op regel 14 ?

https://fgheysels.github.io/


  • DukeMan
  • Registratie: Mei 2000
  • Niet online
is name geen preserved word binnen SQL???

Je hebt namelijk "as name"...

  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

Zet je parameter eens default op 0.
Als die niet ingevuld wordt, heeft die de waarde NULL en kan je de waarde niet vergelijken met een geldige integer...

  • shades
  • Registratie: September 2001
  • Laatst online: 19-05 08:57
whoami schreef op 09 december 2003 @ 23:09:
Even een algemene opmerking:
[..]
Ik heb:
code:
1
if @block_table is not null
Dat gaat een stuk beter.
Verder haken om parameters gezet en de overbodige else blokken weggehaald (moet er dan geen return... voor de netheid ofzo?...).

De 2 selecten.. Ik had er geen idee van dat het ook op die manier kon, @var = veld, dus dat heb ik ook aangepast.

De SELECT COUNT() is niet wat ik wil.. Ik wel de inhoud van die qry, niet hoeveel het er zijn.. in het veld staat de naam van een tabel die ik nodig heb in de qry die ik bij EXEC (..) uitvoer.
NTGiant schreef op 10 december 2003 @ 08:38:
is name geen preserved word binnen SQL???

Je hebt namelijk "as name"...
Blokhaken omheen gezet
Annie schreef op 09 december 2003 @ 23:19:
tip: om de layout beter te krijgen kan je gewoon op een nieuwe regel beginnen.
bijv. dit is gewoon valide t-sql
SQL:
1
2
3
DECLARE @s VARCHAR(100)
SET @s = 'dit is '
       + 'een varcharretje'
Heb ik aangepast... (wordt er alleen niet echt mooier op..

https://k1600gt.nl


  • shades
  • Registratie: September 2001
  • Laatst online: 19-05 08:57
sp ziet er nu zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
CREATE       PROCEDURE [dbo].[homepage_fetch_block_content]

   (
   @block_id int
   )

AS

   declare @block_table varchar(50)
   declare @block_id_field varchar(15)
   declare @block_name_field varchar(20)

   if @block_id > 0
      begin
         
         set @block_table = (select [block_table]
                               from homepage_blocks
                               where block_id = @block_id)

         if @block_table is not null
         
            begin
   
               select @block_id_field = block_id_field,
                      @block_name_field = block_name_field
                 from homepage_blocks
                 where block_id = @block_id
   
               exec ('select
                        b.block_id, ' +
                        @block_id_field + ' as name_id,' +
                        @block_name_field + ' as [name]
                          from homepage_blocks as b, ' + @block_table + '
                          where block_id = ' + @block_id)
            end
      end
GO


Is dit een hoe het eruit zo moeten zien ?

https://k1600gt.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Ik snap het eigenlijk niet zo goed hoor....
Waarom haal je 3x gegevens uit de homepage_blocks table? (regel 16, regel 24 en 29)?
Kan je dat niet in 1 query doen?
Je query in regel 29 zal trouwens ook voor een cartesisch product zorgen, aangezien je in je FROM clausule 2 tabellen hebt staan, maar deze nergens joined. Je zult dus voor ieder record in tabel A, ieder record in tabel B weerkrijgen; je krijgt dus aantal records van tabel A x aantal records van tabel B terug.
Ik snap trouwens nog altijd niet wat de bedoeling is van de query op lijn 29? Wat wil je ermee bereiken, en waarom kan het niet in 1 query?

https://fgheysels.github.io/


  • shades
  • Registratie: September 2001
  • Laatst online: 19-05 08:57
tja. tis misschien wel helemaal niet goed wat ik aan het doen ben..

Ik ben een beetje aan het klooien met m'n website. Ik doe even een voorbeeldje schetsen.

Ik heb de volgende tabellen: homepage_panoramas, homepage_overige en homepage_berichten

homepage_panorama bevat ondermeer de volgende kolomen panorana_id, panorama_titel, panorama_datum etc.
homepage_overige bevat de kolomen overige_id, overige_titel etc
homepage_berichten bevat bericht_id, bericht_onderwerp, bericht_body etc

Omdat ik deze (en meer) als soort van blokken wil gaan gebruiken heb ik een tabel homepage_blocks in het leven geroepen om deze 3 (afhankelijk hoeveel records er beschikbaar zijn) dus als blok om mijn website te tonen.
De blokken tabel bevat de volgende rijen


edit:

Oh het resulaat van die sp is dus een rst met meuk van de volgende kolomen: block_id (maar is dus altijd hetzelfde), bv panoramas_id as name_id en panorama_title as [name]

block_id, block_name, block_table, block_id_field, block_name_field, block_position, block_visible, block_list_template, block_module_template.

Waarschijnlijk zal je denken, "na, wat is die onhandig bezig", misschien wel maar dat wat het enige wat ik kon verzinnen om zo verschillende tabellen op te kunnen halen zonder dat ik hoef te weten hoe die heten.. Ik hoef alleen maar het block_id op te geven en heb alles.

Volg je em nog ?

[ Voor 10% gewijzigd door shades op 10-12-2003 20:59 ]

https://k1600gt.nl


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 13:02
Nee :?
shades schreef op 10 december 2003 @ 20:55:
Ik heb de volgende tabellen:
code:
1
2
3
4
5
Tabel_homepage_panoramas
  panorama_id, 
  panorama_titel, 
  panorama_datum
  etc...


code:
1
2
3
4
Tabel homepage_overige
  overige_id
  overige_titel
  etc...


code:
1
2
3
4
5
Tabel homepage_berichten
  bericht_id,
  bericht_onderwerp, 
  bericht_body
  etc...
Waarom normaliseer je bovenstaande tabellen niet 1 stap verder?
Dus:
code:
1
2
3
4
Tabel Homepage
  id,
  titel,
  block_id


waarbij block_id net als nu de koppeling vormt naar een vervolgtabel met aanvullende info over het betreffende onderwerp, bv:

code:
1
2
3
Tabel panorama
  id,
  datum


code:
1
2
3
Tabel berichten
  id,
  body


Hierdoor kan je alle info voor de homepage trekken uit de tabel homepage. En pas als iemand door klikt op 1 van de items op de homepage, wordt de betreffende tabel geopend.

  • Coltrui
  • Registratie: Maart 2001
  • Niet online

Coltrui

iddqd

Heb je het volgende nu al geprobeerd?

code:
1
2
3
4
CREATE PROCEDURE [DBO].BLEGH
@block_id int = 0

...

  • shades
  • Registratie: September 2001
  • Laatst online: 19-05 08:57
jvdmeer schreef op 10 december 2003 @ 23:50:
[...]


Nee :?


[...]


Waarom normaliseer je bovenstaande tabellen niet 1 stap verder?
dus ik moet aan die 3 tabellen het block_id toevoegen ? Maar dan krijgt ieder record in homepage_panoramas bv block_id=1 en bij homepage_overige wordt block_id=2 bv

bij panoramas wordt dat bv:

code:
1
2
3
4
panorama_id, block_id, panorama_name
1            1         panorama-a
2            1         panorama-b
3            1         panorama-c


en bij homepage_overige

code:
1
2
3
4
overige_id, block_id, overige_name
1           2         overige-a
2           2         overige-b
3           2         overige-c


Zoiets ??

https://k1600gt.nl


  • shades
  • Registratie: September 2001
  • Laatst online: 19-05 08:57
niemand ?

https://k1600gt.nl

Pagina: 1