Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno For each row MSSQL

Snažím se dneska sesmolit nějaký foreach cyklus pro trigger v MSSQL, ovšem vše co jsem nacházel je nějaké zmatené. Nejdřív si zjistit počet řádků, pak ...... Ovšem například v Oracle je přímo For each row ... v MSSQL nic takového není?

Předmět Autor Datum
Můžeš zkusit cursor.
Wikan 01.11.2011 09:20
Wikan
já jsem zkusil sesmolit toto CREATE TRIGGER deactive_company ON f_table AFTER UPDATE AS DECLARE @c…
tomas.kulhanek 01.11.2011 09:30
tomas.kulhanek
A nestačilo by prostě: DELETE FROM root WHERE id IN (SELECT id FROM f_table WHERE deleted = 1) ?
Wikan 01.11.2011 10:15
Wikan
V triggeri v MSSQL môžeš pristupovať k špeciálnym tabuľkám inserted a deleted. Ak chceš vymazať zázn… poslední
los 01.11.2011 21:07
los

já jsem zkusil sesmolit toto

  CREATE TRIGGER deactive_company
	ON f_table
    AFTER UPDATE
    AS
		DECLARE @cnt int
		DECLARE @cntMax int
		SELECT @cnt=1;
		SELECT @cntMax =Count(ID) FROM f_table
		DECLARE @y int
		DECLARE @id decimal(10,0)
		DECLARE @deleted int
		
	WHILE @cnt <= @cntMax
	BEGIN --While Loop
		SELECT @id=ID,@deleted = DELETED FROM f_table WHERE RowNumber=@cnt
		IF @delted = 1
			BEGIN
				DELETE FROM ROOT WHERE ID = @id
				DELETE FROM MAIN_VIEW WHERE ID = @id
			END
		--do something based on the query

		SELECT @cnt = @cnt+1
	END --While Loop
	
	GO

V triggeri v MSSQL môžeš pristupovať k špeciálnym tabuľkám inserted a deleted. Ak chceš vymazať záznamy týkajúce sa aktualizovaných riadkov, tak môžeš jednoducho vymazať z tabuliek ROOT a MAIN_VIEW tie záznamy, ktoré majú v inserted tabuľke nastavený stĺpec deleted.

Prechádzanie záznamami tabuliek sa normálne robí pomocou kurzoru (tak ako písal Wikan), ale práca nad množinou je efektívnejšia, takže použi normálny množinový príkaz DELETE (tak ako písal Wikan).

Zpět do poradny Odpovědět na původní otázku Nahoru