[SQL SVR2K] Stored procedure werkt niet, syntaxfout?

Pagina: 1
Acties:
  • 337 views sinds 30-01-2008
  • Reageer

  • Toink
  • Registratie: Januari 2000
  • Niet online
Voor een klus ben ik bezig met MS SQLServer 2000 en heb ik een aantal stored procedures nodig. Één ervan was vrij simpel en die werkte dus ook meteen, maar ik heb een andere en die krijg ik maar niet aan de praat. Als ik op de "check syntax"-knop druk dan krijg ik een foutmelding.

Goed, ook dat kan ik oplossen.... dacht ik. Dus ik ga de procedure gewoon uitkleden (dus niet opmerken dat dit momenteel een zinloze functie is ;)) tot ik een minimale hoeveelheid gegevens overhoud en dat is het volgende:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE FUNCTION dbo.CreateMessage (@MESSAGETEXT As sql_Variant,  @MSGV1 As sql_Variant,  @MSGV2 As sql_Variant,  @MSGV3 As sql_Variant,  @MSGV4 As sql_Variant )  
RETURNS VARCHAR(255) AS  
BEGIN 
DECLARE @ERRORMESSAGE varchar(255)
DECLARE @MESSAGES1 varchar(255)
SELECT @ERRORMESSAGE = 

        CASE WHEN @MSGV1 IS NULL THEN
            @MESSAGES1=''
        ELSE
            @MESSAGES1 = RTRIM(@MSGV1)
        END 

RETURN @ERRORMESSAGE

END

Foutmelding: Error 156: Incorrect statement near the keyword case.

De functie nog verder uitkleden tot puur een aanpassing van messages1 naar quotes levert Error 170: Incorrect syntax near @messages1.

Het probleem is dat ik blijkbaar variabele messages1 geen waarde kan toekennen. Ik denk dat dit te maken heeft met de plaats waar ik de statements neerzet, maar zeker weten doe ik dit niet. Op internet vind je veel over stored functies maar daar staat behalve basic voorbeelden niets over variabelen die in de functie worden toegewezen.

Wat klopt er niet aan deze functie en hoe zorg ik dat hij syntactisch in orde komt?

  • Cyphax
  • Registratie: November 2000
  • Nu online

Cyphax

Moderator LNX
Je mist volgens mij de kolom waar de case voor geldt.
case @msgv1
when @msgv1 = [...]

[edit]
Hoewel... het is niet verplicht zo te zien.

Zo dan:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE FUNCTION dbo.CreateMessage (@MESSAGETEXT As sql_Variant,  @MSGV1 As sql_Variant,  @MSGV2 As sql_Variant,  @MSGV3 As sql_Variant,  @MSGV4 As sql_Variant )  
RETURNS VARCHAR(255) AS  
BEGIN 
DECLARE @ERRORMESSAGE varchar(255)
DECLARE @MESSAGES1 varchar(255)
SELECT @ERRORMESSAGE = 

        CASE WHEN @MSGV1 IS NULL THEN
            ''
        ELSE
            RTRIM(@MSGV1)
        END    

RETURN @ERRORMESSAGE

END

[ Voor 125% gewijzigd door Cyphax op 02-05-2007 09:16 ]

Saved by the buoyancy of citrus


  • Toink
  • Registratie: Januari 2000
  • Niet online
Cool, het werkt inderdaad. Toch een klein foutje dus. Dat brengt me wel bij een volgende vraag:

SQL:
1
2
3
4
5
6
7
8
SELECT VAR1 = 
    CASE WHEN [VOORWAARDE] THEN
        VAR2 = WAARDE
        VAR3 = WAARDE2
        VAR4 = WAARDE3
    ELSE
        (VAR1 =) WAARDE4
    END


Blijkbaar kan het dus niet op bovenstaande manier dat ik meerdere variabelen een waarde toeken in een select statement? Maar betekent dit dan dat ik voor een situatie als bovenstaande dan een selectstatement moet schrijven voor elke variabele die wordt aangepast?

  • Cyphax
  • Registratie: November 2000
  • Nu online

Cyphax

Moderator LNX
Ik denk het wel ja, omdat je in je case-statement 1 variabele vult.

Maar zeker weten doe ik dat niet, ik heb dat nog nooit geprobeerd. :)

Saved by the buoyancy of citrus


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
je kunt variabelen toch ook aanpassen met het SET commando?

SQL:
1
2
3
4
5
DECLARE @appel INT

SET @appel = 12

SET @appel = SELECT COUNT(*) FROM table

  • Cyphax
  • Registratie: November 2000
  • Nu online

Cyphax

Moderator LNX
Dat klopt, maar dat werkt ook niet als je zoiets probeert:
SQL:
1
2
3
4
5
        CASE WHEN @MSGV1 IS NULL THEN
            set @MESSAGES1=''
        ELSE
            set @MESSAGES1 = RTRIM(@MSGV1)
        END    

Saved by the buoyancy of citrus


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
volgens mij wel als je niet daarvoor een SELECT nogwattes doet, maar gewoon begint met CASE...

of werkt dat niet? (heb het niet getest nl.)

dus:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE FUNCTION dbo.CreateMessage (@MESSAGETEXT As sql_Variant,  @MSGV1 As sql_Variant,  @MSGV2 As sql_Variant,  @MSGV3 As sql_Variant,  @MSGV4 As sql_Variant )   
RETURNS VARCHAR(255) AS   
BEGIN  
DECLARE @ERRORMESSAGE varchar(255) 
DECLARE @MESSAGES1 varchar(255) 

CASE WHEN @MSGV1 IS NULL THEN 
            SET @MESSAGES1='' 
ELSE 
            SET @MESSAGES1 = RTRIM(@MSGV1) 
END     

RETURN @ERRORMESSAGE 

END

  • Cyphax
  • Registratie: November 2000
  • Nu online

Cyphax

Moderator LNX
Dat gaat niet, dan krijg je ook foutmeldingen. :)
Server: Msg 156, Level 15, State 1, Procedure CreateMessage, Line 7
Incorrect syntax near the keyword 'CASE'.
Server: Msg 137, Level 15, State 1, Procedure CreateMessage, Line 9
Must declare the variable '@MESSAGES1'.
Server: Msg 137, Level 15, State 1, Procedure CreateMessage, Line 11
Must declare the variable '@MESSAGES1'.

Saved by the buoyancy of citrus


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
heb je echt een CASE nodig, of zou je het ook met IF kunnen doen?

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
CREATE FUNCTION dbo.CreateMessage (@MESSAGETEXT As sql_Variant,  @MSGV1 As sql_Variant,  @MSGV2 As sql_Variant,  @MSGV3 As sql_Variant,  @MSGV4 As sql_Variant )    
RETURNS VARCHAR(255) AS    
BEGIN   
DECLARE @ERRORMESSAGE varchar(255)  
DECLARE @MESSAGES1 varchar(255)  

IF @MSGV1 IS NULL  
            SET @MESSAGES1=''  
ELSE  
            SET @MESSAGES1 = RTRIM(@MSGV1)  

RETURN @ERRORMESSAGE


(moet je waarschijnlijk nog wel even een CONVERT toepassen op de gegevens...

  • Toink
  • Registratie: Januari 2000
  • Niet online
If-statement kan ook, als het dan wél werkt... die conversie heb ik inmiddels al gedaan want ook ik was daar tegenaan gelopen :) . Ik ga het eens proberen.

Edit: de IF-statement geeft helaas dezelfde meldingen met jouw voorbeeld...

Het is zo raar... dit moet toch gewoon kunnen werken?

>>> Oplossing: Het werkt wel, ik had alleen bij de IF-statement de END laten staan en die hoort er natuurlijk niet. :z

[ Voor 47% gewijzigd door Toink op 02-05-2007 13:16 ]


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Toink schreef op woensdag 02 mei 2007 @ 12:54:
If-statement kan ook, als het dan wél werkt... die conversie heb ik inmiddels al gedaan want ook ik was daar tegenaan gelopen :) . Ik ga het eens proberen.

Edit: de IF-statement geeft helaas dezelfde meldingen met jouw voorbeeld...

Het is zo raar... dit moet toch gewoon kunnen werken?

>>> Oplossing: Het werkt wel, ik had alleen bij de IF-statement de END laten staan en die hoort er natuurlijk niet. :z
tenzij je meerdere statements wilt uitvoeren in je IF... dan wil BEGIN ... END ... nog wel eens helpen...
Pagina: 1