Gå til innhold

Behøver hjelp til en lagret prosedyre for innsetting i T-SQL


Anbefalte innlegg

Jeg er ganske grønn på T-SQL og har derfor kastet meg på et kurs for å lære det. Sliter litt med oppgaven vi har fått. Det er en oppskriftsdatabase hvor den ene tabellen er til for finne konverteringsfaktoren mellom to enheter for en råvare og her skal vi ligge til en ny post. Problemet mitt er at brukeren skal skrive inn enheten og så skal jeg ligge inn id'en til denne enheten i tabellen. Gjengir koden til prosedyren nedenfor. Når jeg kjører den så får jeg følgende melding:

 

Error converting data type varchar to int.

 

Jeg håper jeg har forklart godt nok, men det er bare til å spørre. Veldig takknemlig for forslag.

 

 

CREATE PROCEDURE Legg_til_ny_konvertering

 

@råvare_id INTEGER,

@fra_enhet_id integer,

@till_enhet_id integer,

@faktor DECIMAL (10,2),

@enhetsnavn VARCHAR(50),

@enhetsnavn1 VARCHAR(50),

@enhetsnavn2 VARCHAR(50),

@råvaranavn VARCHAR (50)

 

AS

BEGIN

 

DECLARE @count INTEGER

DECLARE @råvaraid INTEGER

 

 

SET @fra_enhet_id =(SELECT id FROM enhet where WHERE namn=@enhetsnavn1)

SET @till_enhet_id =(SELECT id FROM enhet where WHERE namn=@enhetsnavn2)

SET @råvareid =(SELECT id from Råvare where navn=@råvarenavn)

 

SELECT @COUNT = COUNT (*)

FROM ENHET E, RÅVARE R

WHERE E.navn = @enhetsnavn

OR

R.navn = @råvaranavn

IF @count<1

RAISERROR ('Enheten finnes ikke i databasen. Sjekk om du har skrevet riktig navn og prøv igjen',11,1)

ELSE

INSERT INTO Enhet_Till_Enhet (fra_enhet_id,til_enhet_id,faktor,råvare_id)

VALUES (@fra_enhet_id,@til_enhet_id,@faktor,@råvareid)

 

END

Lenke til kommentar
Videoannonse
Annonse
Har du en beskrivelse av tabellene du benytter? Kan det være at ID i enhtetabellen er en varchar e.l. og ikke alltid kun inneholder tall?

Tabellen som jeg skal ligge inn posten heter Enhet_til_enhet og består av følgende kolonner id, faktor, råvare_id,fra_enhet_id og til_enhet_id.

Inparameterene skal være fra_enhet, til_enhet, faktor og råvare_navn og prosedyren skal da hente id'ene fra deres respektive tabeller og sitte inn disse istedenfor navnene som er blitt angitt.

Lenke til kommentar

Ja, men hvordan er det med datatypene. Det som går galt, er at du forskøker å legge en string-verdi inn i enten en celle, eller en variabel som er integer. Dette går bra så lenge verdien du forsøker å legge inn er et gyldig tall.

 

Jeg ville sjekka alle tabeller du henter data fra, og kontrollert om noen av verdiene du forsøker å håntere som integere egentlig inneholder bokstaver e.l.

Lenke til kommentar

Tabellene jeg henter data fra inneholder bare integer, men jegser at jeg har ikke lagt ved eksempel på hva jeg ligger inn og da er problemet mitt ikke så tydelig. Jeg forsøker å sende følgende til prosedyren: 'st',''kg',01,'', hvor tre av disse er stringer, men det som skal ligges inn i tabellen er id'ene til disse, altså integer. Jeg har løst å løse det i følgende kode, så jeg tror det er her problemet ligger:

 

SET @fra_enhet_id =(SELECT id FROM enhet where WHERE namn=@enhetsnavn1)

SET @till_enhet_id =(SELECT id FROM enhet where WHERE namn=@enhetsnavn2)

SET @råvareid =(SELECT id from Råvare where navn=@råvarenavn)

INSERT INTO Enhet_Till_Enhet (fra_enhet_id,til_enhet_id,faktor,råvare_id)

VALUES (@fra_enhet_id,@til_enhet_id,@faktor,@råvareid)

 

Håper dette var litt oppklarende.

Lenke til kommentar

Skriver du altså noe som:

Execute legg_til_ny_konvertering 'st', 'kg' osv?

 

Da forsøker du vel å legge 'st' inn i @råvareid. Og det vil jo gå grusomt galt.

 

Kanskje du egentlig vil at en del av det du har definert som innparametere egentlig skal være variable i selve prosedyra, altså innenfor declare delen?

Lenke til kommentar
Skriver du altså noe som:

Execute legg_til_ny_konvertering 'st', 'kg' osv?

 

Da forsøker du vel å legge 'st' inn i @råvareid. Og det vil jo gå grusomt galt.

 

Kanskje du egentlig vil at en del av det du har definert som innparametere egentlig skal være variable i selve prosedyra, altså innenfor declare delen?

 

Jaaa :yes: Jeg forsøker å kode det slik at inparameteret er f.eks 'st' så skal den lagrede prosedyren finne id'en til 'st' i enhetstabellen og ligge id'en inn på riktig kolonne i konverteringstabellen. Så 'st' skal aldri inn som verdi i tabellen, bare dens id som da er integer. Noen forslag til hvordan jeg kan gjøre det?

Lenke til kommentar

Det er mulig jeg misforstår hva du prøver på, men det ser ut til at du blander litt mellom hva du deklarerer av variable, og hva du setter som innparametere.

 

Se på denne koden:

CREATE PROCEDURE Legg_til_ny_konvertering

@enhetsnavn VARCHAR(50),
@enhetsnavn1 VARCHAR(50),
@enhetsnavn2 VARCHAR(50),
@råvaranavn VARCHAR (50)


AS
BEGIN

DECLARE @count INTEGER
DECLARE @råvaraid INTEGER 
DECLARE @fra_enhet_id integer
DECLARE @till_enhet_id integer

SET @fra_enhet_id =(SELECT id FROM enhet where WHERE namn=@enhetsnavn1)
SET @till_enhet_id =(SELECT id FROM enhet where WHERE namn=@enhetsnavn2)
SET @råvareid =(SELECT id from Råvare where navn=@råvarenavn)

SELECT @COUNT = COUNT (*)
FROM ENHET E, RÅVARE R
WHERE E.navn = @enhetsnavn
OR
R.navn = @råvaranavn

IF @count<1
RAISERROR ('Enheten finnes ikke i databasen. Sjekk om du har skrevet riktig navn og prøv igjen',11,1)
ELSE
INSERT INTO Enhet_Till_Enhet (fra_enhet_id,til_enhet_id,faktor,råvare_id)
VALUES (@fra_enhet_id,@til_enhet_id,@faktor,@råvareid)

END

 

Her er det da plass til fire innparametere i toppen, som skal inn i rekkefølgen enhetsnavn, enhetsnavn1, enhetsnavn2, råvarnanvn.

 

Du bør da sende alle disse parameterene inn i EXECUTE kommandoen din.

 

1) Er du sikker på at du trenger alle de feltene for enhetsnavn?

2) I kontrollen din av om enhetene finnes:

SELECT @COUNT = COUNT (*)
FROM ENHET E, RÅVARE R
WHERE E.navn = @enhetsnavn
OR
R.navn = @råvaranavn

Burde du ikke her heller kontrollere de to enhetene du faktisk benytter i koden, og heller droppe den tredje enhetsbetegnelsen din? Altså noe som dette:

SELECT @COUNT = COUNT (*)
FROM ENHET E, RÅVARE R
WHERE E.navn = @enhetsnavn1
OR
R.navn = @råvaranavn

 

3) Variabelen "faktor" har du ikke deklarert, så den vil gi en feil.

 

4) Til sist så er kontrollen din av om innparameterene finnes litt uklar for meg. ALLE de tre verdiene du sender inn må finnes i både enhet og råvaretabellen, eller hva? Sånn jeg ser det, så må da hele koden skrives om til noe som:

 

CREATE PROCEDURE Legg_til_ny_konvertering

@enhetsnavn1 VARCHAR(50),
@enhetsnavn2 VARCHAR(50),
@råvaranavn VARCHAR (50)


AS
BEGIN

DECLARE @count_enhet1 INTEGER
DECLARE @count_enhet2 INTEGER
DECLARE @count_råvare INTEGER
DECLARE @råvareid INTEGER 
DECLARE @fra_enhet_id integer
DECLARE @till_enhet_id integer

SET @fra_enhet_id =(SELECT id FROM enhet where WHERE namn=@enhetsnavn1)
SET @till_enhet_id =(SELECT id FROM enhet where WHERE namn=@enhetsnavn2)
SET @råvareid =(SELECT id from Råvare where navn=@råvarenavn)

SELECT @count_enhet1 = COUNT (*)
FROM ENHET E
WHERE E.navn = @enhetsnavn1

SELECT @count_enhet2 = COUNT (*)
FROM ENHET E
WHERE E.navn = @enhetsnavn2

SELECT @count_råvare = COUNT (*)
FROM RÅVARE R
where R.navn = @råvaranavn

IF @count_enhet1<1
RAISERROR ('Enhet 1 finnes ikke i databasen. Sjekk om du har skrevet riktig navn og prøv igjen',11,1)
IF @countenhet2<1
RAISERROR ('Enhet 2 finnes ikke i databasen. Sjekk om du har skrevet riktig navn og prøv igjen',11,1)
IF @count_råvare<1
RAISERROR ('Råvaren finnes ikke i databasen. Sjekk om du har skrevet riktig navn og prøv igjen',11,1)
ELSE
INSERT INTO Enhet_Till_Enhet (fra_enhet_id,til_enhet_id,faktor,råvare_id)
VALUES (@fra_enhet_id,@till_enhet_id,1,@råvareid)

END

 

Merk at jeg i koden til sist har lagt inn 1 for faktor.

 

Koden kan også egentlig gjøres enklere ved å kontrollere direkte på fra_enhet_id osv. verdiene i IF setningene dine...

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...