22. april 2003 - 13:55Der 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
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 !
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'.
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.
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
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
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!
Synes godt om
Ny brugerNybegynder
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.