Avatar billede shale Nybegynder
22. april 2003 - 13:55 Der er 9 kommentarer og
1 løsning

Hjælp mig med variabler til en stored procedure

Nu har jeg siddet lidt og fusket rundt med en stored procedure som jeg bare ikke kan få til at virke, så nu ville jeg lige smide den herind for at få et lille hint :D

Jeg har en index tabel (kaldet "index) over en masse part numre. Ud for hver part er der et id som skal angive hvilken tabel man kan finde de yderligere informationer til denne part.
Dette id refererer til tabellen "tabel", hvor jeg så finder navnet på den tabel hvor denne kan findes.

Problemet er at jeg ikke kan returnere part nummeret selv om det eksisterer da min sql query analyzer knækker sig over det og giver følgende fejl:

"Server: Msg 207, Level 16, State 3, Line 1
Invalid column name 'yL'."

Jeg kan fint gøre det hvis jeg erstatter @part_no med et part nummer
Koden er som følger (håber at i kan følge den):
###############################################
CREATE PROCEDURE sp_check_table_for_part
@part_no INT
AS

DECLARE @table VARCHAR(50)

SET @table = (SELECT [table].table_name FROM [index]
    INNER JOIN [table] ON [table].table_id = [index].table_id
    WHERE [index].part_no=@part_no)

EXEC ('SELECT [part_no] FROM [' + @table + ']  WHERE [part_no] = ' + @part_no)
GO
Avatar billede janus_007 Nybegynder
22. april 2003 - 15:54 #1
Det er relativt nemt at debugge den slags... Enten via debuggeren eller som jeg nok bare ville benytte i dit tilfælde, at skrive PRINT istedet for EXEC !

Se om den ser ud som den skal, evt. teste den :O)

Smid den evt. her igen, hvis....
Avatar billede shale Nybegynder
23. april 2003 - 07:49 #2
Well hvis jeg fx bare skriver den som en SELECT skriver den følgende:
Server: Msg 208, Level 16, State 1, Procedure sp_check_table_for_part, Line 11
Invalid object name '@table'.
Avatar billede shale Nybegynder
23. april 2003 - 07:59 #3
Hov den ser selvfølgelig sådan her ud :D

SELECT [part_no] FROM [@table] WHERE [part_no] = @part_no
Avatar billede venne Nybegynder
23. april 2003 - 09:17 #4
Det går ikke, man kan ikke angive tabel med en variabel. Du er nødt til at lave dynamisk SQL, som du også gør i din sp. Har du checket præcis hvad det er for en SELECT, den prøver at udføre i EXEC - prøv at printe sql'en ud og kør den i hånden.

/venne
Avatar billede janus_007 Nybegynder
23. april 2003 - 09:46 #5
Du skal heller ikke skrive den som en select!! Bare med print foran :O) istedet for exec.

Men men, dit part_no skal konverteres til varchar

CREATE PROCEDURE sp_check_table_for_part
@part_no INT
AS

DECLARE @table VARCHAR(50)

SET @table = (SELECT [table].table_name FROM [index]
    INNER JOIN [table] ON [table].table_id = [index].table_id
    WHERE [index].part_no=@part_no)

EXEC ('SELECT [part_no] FROM [' + @table + ']  WHERE [part_no] = ' + CAST(@part_no AS VARCHAR(100))
GO

Prøv evt. også at sætte @table til en værdi, og brug print!. Det er vigtigt at kunne nogle debug teknikker når der arbejdes med dynamisk sql :O)
Avatar billede janus_007 Nybegynder
23. april 2003 - 09:49 #6
hmm du skal sføli være sikker på at din select til at sætte @table rent faktisk returnere noget!

Det er derfor jeg råder dig til at sætte dine variabler eks.vis @table til en værdi du selv vælger, og prøver at printe det hele ud.... Håber du kan følge mig
Avatar billede janus_007 Nybegynder
23. april 2003 - 09:50 #7
ps. husk lige en slut parentes efter cast til varchar, der mangler en ser jeg lige...

Godmorgen *GG*
Avatar billede shale Nybegynder
23. april 2003 - 10:14 #8
Ok den virker ikke helt men kan godt se hvor du vil henad

Og jeg ved at @table returnerer noget og at den virker :D Det er bare lige det sidste der med part_no der knækker mig
Avatar billede shale Nybegynder
23. april 2003 - 10:37 #9
Ah fandt ud af det nu.... det var fordi at min variabel blevet kaldet som int jo.
Burde give mig selv et par dummeslag(hvilket nok ville vække opmærsomhed på arbejdet) :D

Men du får point under alle omstændigheder fordi du var hjælpsom + gav mig lidt hjælp (uden at vide det) til nogle andre sp's. Tak for det ;)

Her er den korrekte kode:

CREATE PROCEDURE sp_check_table_for_part
@part_no VARCHAR(100)
AS

DECLARE @table VARCHAR(50)

SET @table = (SELECT [table].table_name FROM [index]
    INNER JOIN [table] ON [table].table_id = [index].table_id
    WHERE [index].part_no=@part_no)

EXEC ('SELECT * FROM [' + @table + ']  WHERE [part_no] LIKE ' +@part_no)
GO
Avatar billede janus_007 Nybegynder
23. april 2003 - 10:49 #10
Ja sådan kan man også gøre!
Det kan betragtes som en implicit konvertering af part_no, da den både kan skrives med '' eller uden :O)

CAST (explicit) er umidlertid også gangbar, det er såmænd smag og behag!
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