Avatar billede lionhcfs Nybegynder
09. februar 2009 - 18:04 Der er 6 kommentarer og
1 løsning

Subselect med variabler fejler i en SP og problemer med CURSOR

Jeg er igang med en SP som jeg ikke kan få til at fungere efter hensigten.

Jeg har skrevet en del SP til MySQL, men skal have lavet en til Ms SQL og der er nogle ting jeg får brug for hjælp til:

den vigtigste lige nu er :

i min SP:
ALTER PROCEDURE [dbo].[usp_parseposts]
        @strPost_id INT
AS
    DECLARE @tmpSerial nVARCHAR(128);
    DECLARE @tmpMeterID INT;
    DECLARE @tmpBoxID INT;
   
--- lidt kode -------

SET @tmpMeterID = (SELECT id FROM meters WHERE [box_id] = @tmpBoxID AND [serial] LIKE @tmpSerial)

--- lidt mere kode ----



Jeg har prøvet at uskrive hhv @tmpBoxID og @tmpSerial lige inden subselect'en og de er hvad de skal være (f.x. 1 og '00000001') men uanset hvad, returnerer den NULL i @tmpMeterID

HVIS jeg skriver selecten for sig selv (i en ny Query: SELECT id FROM meters WHERE box_id = 1 AND serial='00000001') så får jeg det rigtige resultat (1) men i SP'en kommer den altid tilbage med en "NULL"... hvad gør jeg galt ?





Det andet problem jeg har er med CURSOR

jeg har denne definieret:

DECLARE GETPOSTS CURSOR FOR SELECT contents FROM post_values WHERE post_id = @strPost_id ORDER BY number


Når jeg bruger @strPost definieret som en parameter så funker den fint, men hvis jeg DECLARE den istedet (og giver den en værdi selvf.) så kører den slet ikke cursoren (eller den er ihvertfald tom.. ) Og returnerer ingen fejl heller..
Avatar billede kentjohansen Nybegynder
09. februar 2009 - 18:11 #1
1.
SET @tmpMeterID = (SELECT id FROM meters WHERE [box_id] = @tmpBoxID AND [serial] LIKE @tmpSerial)

prøv i stedet

SELECT @tmpMeterID = id FROM meters WHERE [box_id] = @tmpBoxID AND [serial] LIKE @tmpSerial

2
Altså hvis du har @strPost som et input param til din SP, så virker det fint, men hvis du i stedet i SP'en f.eks. har:

DECLARE @strPost INT

så virker det ikke??

Er du sikker på at du har:
SET @strPost = 1
Avatar billede lionhcfs Nybegynder
09. februar 2009 - 18:24 #2
Hej.
1:

Har lige prøvet den SELECT @tmpMeterID = id FROM.... men den giver samme resultat..



2:
Ja .. hvis den sættes som parameter, funker det, men DECLAREr jeg den (og giver den en værdi), så virker det ikke ..

-Leo
Avatar billede lionhcfs Nybegynder
09. februar 2009 - 18:28 #3
2:
prøvede lige at give sætte @tmpMeterID = 0

Hvilket resulterer i at der nu står 0 i kolonnen for id'en i alle rækker (som om den ikke bliver kaldt)

-Leo
Avatar billede kentjohansen Nybegynder
09. februar 2009 - 18:45 #4
1. I din kode skrive du LIKE, men i dit eksempel som du laver særskildt bruger du ikke LIKE. Er det en fejl? Har du prøvet at lave din test select nøjagtigt som i din sp.

Du kan evt udelade linien med declare, således at din sp rent faktisk laver selve selecten, som du så kan se i din query analyser - eller andet værktøj som du benytter.

Det kunne også være et problem at du bruger nVARCHAR (sammen med en like) som datatype på @tmpSerial. Kan du ikke nøjes med VARCHAR?
Avatar billede lionhcfs Nybegynder
09. februar 2009 - 19:04 #5
1: Da datatypen på feltet hvor @tmpSerial er fra er nVarchar(128) går jeg ud fra at jeg bør bibeholde datatypen som nvarchar

Jeg fandt fejlen der lå i udledningen af @tmpSerial - dumme mig men takker for hjælpen med den halvdel...

Så er der kun #2 tilbage... Altså:

ALTER PROCEDURE [dbo].[usp_test2]
   
        @strPost_id INT
AS

--- en masse DECLARE's --------

DECLARE GETPOSTS CURSOR FOR SELECT contents FROM post_values WHERE post_id = @strPost_id ORDER BY number


--- kode ---

    OPEN GETPOSTS;
    FETCH NEXT FROM GETPOSTS INTO @tmpRequest


--- kode ---
Kørt med

EXEC @usp_test2 68567

så kommer der data i @tmpRequest



HVIS jeg istedet kører uden parametre og DECLAREr den istedet:

ALTER PROCEDURE [dbo].[usp_test2]
   
AS

    DECLARE @strPost_id INT

--- en masse DECLARE's --------

DECLARE GETPOSTS CURSOR FOR SELECT contents FROM post_values WHERE post_id = @strPost_id ORDER BY number


--- kode ---

    SET @strPost_id = 68567
    OPEN GETPOSTS
    FETCH NEXT FROM GETPOSTS INTO @tmpRequest
--- kode ---

Kørt med

EXEC @usp_test2

så kommer der ingen data i @tmpRequest

Hvad gør jeg galt her så ?

-Leo
Avatar billede lionhcfs Nybegynder
09. februar 2009 - 19:56 #6
Det lader til at Variablen skal være defineret INDEN CURSORen declare's .. det er ihvertfald en forskel fra MySQL hvor den skal DECLARE's i starten...

Smid et svar så får du points for hjælpen!

-Leo
Avatar billede kentjohansen Nybegynder
09. februar 2009 - 21:37 #7
Ja, DECLARE skal i starten. Godt du fandt problemet
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester