Cytat(prachwal @ 6.08.2010, 14:19:48 )

ISNULL(@zmienna,'wartość w przypadku gdzy @zmienna jest Null')
Ale id nie ma prawa być null bo w celach testów wpisuję nazwisko i imię osoby która istnieje w bazie. Zresztą jak próbuję tylko na pierwszej części procedury czyli wpisanie id osoby to działa, błędami sypie w chwili jak chcę sprawdzić i dodać jeszcze id przedmiotu.
Domyślam się, że chodzi o "połączenie" pomiędzy IF-ami i nie wiem jak je zrobić.
ALTER PROCEDURE wstaw_ocene
@nazwisko VARCHAR(30)
,@imie CHAR(15)
,@przedmiot_nazwa CHAR(15)
AS
DECLARE
@osoba_id INT
,@przedmiot_id INT
BEGIN
IF NOT EXISTS (SELECT 1 FROM osoba WHERE nazwisko = @nazwisko AND imie = @imie)
PRINT 'W bazie nie istnieje osoba o takich danych'
SELECT @osoba_id = osoba_id FROM osoba
INSERT INTO osoby_oceny (osoba_id)
VALUES (ISNULL(@osoba_id, 'BRAK ID OSOBY')
-- ja za powyższym nawiasem wpiszę średnik to krzyczy błedem
-- jak go usunę to krzyczy Incorrect syntax near 'IF'
-- Jak to połączyć ?
IF NOT EXISTS (SELECT 1 FROM przedmioty WHERE nazwa = @przedmiot_nazwa)
PRINT 'W bazie nie istnieje taki przedmiot'
SELECT @przedmiot_nazwa = przedmiot_id FROM przedmioty
INSERT INTO osoby_oceny (przedmiot_id)
VALUES (@przedmiot_id)
END;
Zmieniłem na
BEGIN
IF NOT EXISTS (SELECT 1 FROM osoba WHERE nazwisko = @nazwisko AND imie = @imie)
PRINT 'W bazie nie istnieje osoba o takich danych'
SELECT @osoba_id = osoba_id FROM osoba
INSERT INTO osoby_oceny (osoba_id)
VALUES (@osoba_id)
IF EXISTS (SELECT 1 FROM przedmioty WHERE nazwa = @przedmiot_nazwa)
SELECT @przedmiot_id = przedmiot_id FROM przedmioty
INSERT INTO osoby_oceny (przedmiot_id)
VALUES (@przedmiot_id)
END;
Procedura się wykonuje ale wstawia w osobny wiersz osoba_id a w osobny przedmiot_id (w celach ćwiczeniowych zdjąłem warunek z tych kolumn NOT NULL).
Jak zrobić aby wstawiał je w jeden wiersz?
Kolumny musza mieć warunek NOT NULL
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
kolejny update :-)
Zmieniłem procedurę jak poniżej ale teraz problem jest taki, że nie są brane pod uwagę parametry wpisane w wywołaniu tylko do tabeli osoby_oceny wstawiane są zawsze id ostanich wierszy z poszczególnych tabel.
ALTER PROCEDURE [dbo].[wstaw_ocene]
@nazwisko VARCHAR(30)
,@imie CHAR(15)
,@przedmiot_nazwa CHAR(15)
,@ocena char(3)
AS
DECLARE
@osoba_id INT
,@przedmiot_id INT
,@ocena_id INT
BEGIN
IF NOT EXISTS (SELECT 1 FROM osoba WHERE nazwisko = @nazwisko AND imie = @imie)
PRINT 'W bazie nie istnieje osoba o takich danych'
SELECT @osoba_id = osoba_id FROM osoba
IF EXISTS (SELECT 1 FROM przedmioty WHERE nazwa = @przedmiot_nazwa)
SELECT @przedmiot_id = przedmiot_id FROM przedmioty
IF EXISTS (SELECT 1 FROM oceny WHERE ocena = @ocena)
SELECT @ocena_id = ocena_id FROM oceny
INSERT INTO osoby_oceny (osoba_id, przedmiot_id, ocena_id)
VALUES (@osoba_id, @przedmiot_id, @ocena_id)
END;
----------------------------------------------------------------------------------------------------
Witam,
Poniżej zamieszczam końcową wersję procedury.
Za wszelkie wskazówki i pomoc serdecznie dziękuję.
CREATE PROCEDURE [dbo].[wstaw_ocene]
@nazwisko VARCHAR(30)
,@imie CHAR(15)
,@przedmiot_nazwa CHAR(15)
,@ocena char(3)
AS
DECLARE
@osoba_id INT
,@przedmiot_id INT
,@ocena_id INT
BEGIN
IF NOT EXISTS (SELECT 1 FROM osoba WHERE nazwisko = @nazwisko AND imie = @imie)
BEGIN
PRINT 'W bazie nie istnieje osoba o takich danych'
RETURN
END
SELECT @osoba_id = osoba_id FROM osoba
WHERE nazwisko = @nazwisko AND imie = @imie;
IF NOT EXISTS (SELECT 1 FROM przedmioty WHERE nazwa = @przedmiot_nazwa)
BEGIN
PRINT 'W bazie nie istnieje taki przedmiot'
RETURN
END
SELECT @przedmiot_id = przedmiot_id FROM przedmioty
WHERE nazwa = @przedmiot_nazwa;
IF NOT EXISTS (SELECT 1 FROM oceny WHERE ocena = @ocena)
BEGIN
PRINT 'W bazie nie ma takiej oceny'
RETURN
END
SELECT @ocena_id = ocena_id FROM oceny
WHERE ocena = @ocena;
INSERT INTO osoby_oceny (osoba_id, przedmiot_id, ocena_id)
VALUES (@osoba_id, @przedmiot_id, @ocena_id);
END;