[MSSQL] Pętla wg danych z tabeli

Odpowiedz Nowy wątek
2019-06-07 10:35
0

Witajcie,
Tworzę pewną automatykę i zatrzymałem się w pewnym momencie. W bazie danych mam tabelę, powiedzmy A, gdzie jest kilka rekordów. Na tabeli B, tworzony jest trigger AFTER INSERT, przez który, w pętli ma dodać nowe rekordy do tabeli C, gdzie jednym z pól jest ID tabeli A.
Czyli taki algorytm:

  1. Dane są zapisywane do tabeli B
  2. Wywoływany jest trigger, który ma pobrać wartości ID z tabeli A i w pętli dodać odpowiednią ilość rekordów do tabeli C, z wykorzystaniem tych pobranych wartości z tabeli A.

Jak to wykonać z poziomu SQL?


Pozdrawiam
Buster

Pozostało 580 znaków

2019-06-07 11:03
1

Prosto. Po pierwsze nie rób magicznych trigerów które coś gdzieś wrzucają (chyba że są to dane audytowe). Zrób procedurę, która ci to zrobi tak jak chcesz w jendej transacji. Nie do końca wiem o co pytasz. Dokumentacja do T-SQL jest ogólnie dostępna i tam jest jak robić pętle, procedury itp.

Pozostało 580 znaków

2019-06-07 13:20
0

Generalnie triggera potrafię napisać. Pętlę też potrafię zrobić. Nie potrafię tylko skonstruować pętli, która będzie zależna od wyników zapytania, i będzie z nich korzystać. A tak BTW wolę oprzeć to o triggera niż procedurę.


Pozdrawiam
Buster

Pozostało 580 znaków

2019-06-07 13:25
0

Jak to jest jakiś system nie testowy to nie rób krzywdy sobie ani nikomu innemu i nie rób tego na trigerze. Pewnie chodzi ci kursora
(https://docs.microsoft.com/en[...]sact-sql?view=sql-server-2017)

Pozostało 580 znaków

2019-06-07 13:39
0

ćNie rozumiem:
1.dodajesz do B

  1. wybierasz coś z A, aby dodać odpowiednią ilość do C

co to ma wspólnego z B, gdzie jest ta ilość rekordów do dodania? Opisz dane z przykładowymi danymi, wtedy mozna pomóc.

I uprzedzając nie potrzebujesz do tego kursora/pętli

Pozostało 580 znaków

2019-06-07 13:54
0
Panczo napisał(a):

ćNie rozumiem:
1.dodajesz do B

  1. wybierasz coś z A, aby dodać odpowiednią ilość do C

co to ma wspólnego z B, gdzie jest ta ilość rekordów do dodania? Opisz dane z przykładowymi danymi, wtedy mozna pomóc.

I uprzedzając nie potrzebujesz do tego kursora/pętli

Nie wiesz co chce zrobić, ale wiesz, że nie potrzebuje pętli i kursora. No to brawo za jasnowidzenie.

Bo jeszcze nie zdarzyla się sytuacja na tym forum aby kursor byl potrzebny, a siedzę tu już trochę ;) Zresztą ja za kursory ucinam ręce... - Panczo 2019-06-07 13:55

Pozostało 580 znaków

2019-06-07 14:25
0

Po kolei. W tabeli A są przechowywany magazyny (nie stany magazynowe, tylko magazyny). Jest ich 5. W tabeli B przechowywane są towary. A w tabeli C stany magazynowe. I teraz, chciałbym osiągnąć coś takiego, że podczas dodawania towaru (tabela B), wywoływany jest trigger, który wpisze do tabeli C, stany magazynowe (zerowe) dla właśnie wpisanego towaru, dla wszystkich dostępnych magazynów. Czy teraz lepiej?? :)


Pozdrawiam
Buster

Pozostało 580 znaków

2019-06-07 14:31
0

To ci powinno pomóc: https://www.w3schools.com/sql/sql_insert_into_select.asp

Pozostało 580 znaków

2019-06-07 14:42

No to teraz rozmawiamy ;)

Nie potrzebujesz pętli jak juz pisałem wcześniej wystarczy cross join, dla uproszczenia, jeżeli masz takie dane:

CREATE TABLE magazyn
    ([id] int)
;

INSERT INTO magazyn
    ([id])
VALUES
    (1),
    (2),
    (3),
    (4),
    (5)
;

CREATE TABLE towar
    ([id] int)
;

CREATE TABLE stany
    ([idM] int, [idT] int, [Stan] int)
;

to wystarczy trigger:

CREATE TRIGGER dbo.trg_dodajStany
   ON  dbo.Towar
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    insert into stany 
    Select
        m.id as idM
        ,i.id as idT
        ,0 as stan
    from
        inserted i
       cross join magazyn m
END
GO

Który po dodaniu do tabeli towar id=1

insert into towar values (1)

stworzy wpisy w tabeli stany:

idM idT Stan
1 1 0
2 1 0
3 1 0
4 1 0
5 1 0

@Tomek Pycia brawa przyjmuje z pokorą ;)

edytowany 1x, ostatnio: Panczo, 2019-06-07 14:42
Dałbym ci plusa, ale nie lubię triggerów i uważam je za ZŁO :P - Tomek Pycia 2019-06-07 14:44
Spoko, ja mam to samo z kursorami i pętlami - Panczo 2019-06-07 14:45

Pozostało 580 znaków

2019-06-07 15:23
0

Właśnie o to chodziło. Wielkie dzięki @Panczo.


Pozdrawiam
Buster
edytowany 1x, ostatnio: Buster, 2019-06-07 15:23

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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