Generator danych w MS SQL oraz MySQL

0

Witam forumowiczów.
Chciałbym prosić o pomoc. Moim zadaniem było stworzenie baz danych odpowiednio w sql oraz mysql co zrobiłem odpowiednio dla sql - microsoft sql server management studio raz dla mysql - ems sql manager for mysql. Następnie miałem utworzyć generatory wypełniające tabele utworzone w tych bazach danych danymi. Problem polega na tym, że przez brak doświadczenia w tej dziedzinie nie poradziłem sobie z tym za dobrze. Czy ktoś znający się na tym mógłby zerknąć na kod mojego generatora i wytknąć w nim błędy ewentualnie je poprawić?
Proszę o rzetelne odpowiedzi.

Oto kod który próbowałem napisać dla sql (tabela nazywa się lecturer, posiada 3 atrybuty: id_lecturer z typem INT, name z typem varchar o długości 32 oraz surname z typem varchar o długości 32. Dodam tylko że taka sama tabela jest utworzona dla mysql.

CREATE PROCEDURE dodaj_do_tabeli_lecturer 
AS
DECLARE @licznik INT; 
SET @licznik=1;
WHILE @licznik <= 100
BEGIN 
    INSERT lecturer ([id_lecturer], name, surname) 
    VALUES(@licznik, 'name' + LTRIM(STR(@licznik)), 'surname' + LTRIM(STR(@licznik))); 
    SET @licznik = @licznik + 1;
END

Kod dla mysql:

CREATE PROCEDURE dodaj_do_tabeli_lecturer 
(id_lecturer INT, name varchar, surname varchar)
DECLARE @licznik INT; 
SET @licznik=1;
WHILE @licznik <= 100
BEGIN 
    INSERT lecturer ([id_lecturer], name, surname) 
    VALUES(@licznik, 'name' + LTRIM(STR(@licznik)), 'surname' + LTRIM(STR(@licznik))); 
    SET @licznik = @licznik + 1;
END
0

Chciałbym tylko dodać, że generator ma za zadanie dodać do tabeli 100 rekordów. Ma to wyglądać mniej więcej tak:
1 imie1 nazwisko1

Niestety nie wiem też czy to, że pole id_lecturer jest autoinkrementowalne będzie tutaj przeszkadzać....

0

Jeśli jest autonumerowanie to nie możesz wstawiać awnie wartości do tej kolumny podczas INSERT (chyba, że ustawisz pewną opcję). W Twoim przypadku albo zrezygnuj z autonumerowania i powinno być ok, ale wykorzystwaj autonumerowanie i pobierając aktualny licznik autonumerowania i dodaj w pętli + 1. Powinno się sprawdzić choć nie będzie to idealne rozwiązanie.

1

To tak, żeby Ci zadziałało:

CREATE TABLE #lecturer
(
id_lecturer INT
, name  VARCHAR (32)
, surname  VARCHAR (32)
)

DECLARE @licznik VARCHAR (3); 
SET @licznik=1;
WHILE @licznik <= 100
BEGIN 
    INSERT INTO #lecturer ([id_lecturer], name, surname) 
    SELECT @licznik, 'name' + @licznik, 'surname' + @licznik; 
    SET @licznik = @licznik + 1;
END

SELECT * FROM #lecturer 

Ja użyłem tabeli tymczasowej, więc popraw to u siebie i ubierz to w procedurę.
Pamiętaj, aby nazwy obiektów podawać dwuczłonowo (wraz z schematem).
Druga sprawa nie możesz zrobić konkatenacji typu znakowego i liczbowego bo niejawna kowersja będzie próbować przekonwertować typ znakowy do wyższego typu w w konwertowaniu czyli do INT a z literami to się nie uda. Zatem zmieniłem typ danych na VARCHAR (3) w przeciwnym wypadku musisz użyc kowersji jawnej z użyciem funkcji CAST lub CONVERT.

0

To zadziała z "moją" tabelą gdzie mam autoinkrementację czy musiałbym tworzyć tabelę od nowa?
Jeśli nie działa to z autoinkrementacją, to jak sobie radzić w takiej sytuacji?
Do tego jeśli mogę spytać, co w takim razie poprawić również w tym skrypcie mysql-owym?

Czy ten kod będzie dobry?:

DELIMITER $$
DROP PROCEDURE IF EXISTS dodaj_lecturer$$
CREATE PROCEDURE dodaj_lecturer 
BEGIN

DECLARE licznik INT DEFAULT 0; 
SET licznik = 1;
WHILE licznik <= 100 do
    INSERT into lecturer ([id_lecturer], name, surname) 
    VALUES(licznik, 'name' + LTRIM(STR(licznik)), 'surname' + LTRIM(STR(licznik))); 
    SET licznik = licznik + 1;
END while;
END $$
DELIMITER ;

--wywołanie procedury:

CALL dodaj_lecturer;
1

Tutaj masz** jedną z wersji** jak radzić sobie z Identity:

 CREATE TABLE #lecturer
(
id_lecturer INT IDENTITY
, name  VARCHAR (32)
, surname  VARCHAR (32)
)
 
DECLARE @licznik VARCHAR (3); 
SET @licznik=1;
WHILE @licznik <= 100
BEGIN 
    INSERT INTO #lecturer ( name, surname) 
    SELECT 'name' + CAST(ISNULL(MAX (id_lecturer),0) + 1 AS VARCHAR), 'surname' + CAST(ISNULL(MAX (id_lecturer),0) + 1 AS VARCHAR) FROM #lecturer
    SET @licznik = @licznik + 1;
END
 
SELECT * FROM #lecturer 

1 użytkowników online, w tym zalogowanych: 0, gości: 1