[MSSQL] Pętla wg danych z tabeli

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?

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.

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ę.

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-us/sql/t-sql/language-elements/declare-cursor-transact-sql?view=sql-server-2017)

0

ćNie rozumiem:
1.dodajesz do B
2. 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

0
Panczo napisał(a):

ćNie rozumiem:
1.dodajesz do B
2. 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.

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?? :)

1

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ą ;)

0

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

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