Użyj zmiennej tabeli lub tabeli tymczasowej.
Jak wspomniano wcześniej, kursor jest ostatecznością. Głównie dlatego, że zużywa dużo zasobów, powoduje blokady i może być znakiem, że po prostu nie rozumiesz, jak prawidłowo używać SQL.
Uwaga dodatkowa: Kiedyś natknąłem się na rozwiązanie wykorzystujące kursory do aktualizacji wierszy w tabeli. Po krótkiej analizie okazało się, że całość można zastąpić jednym poleceniem UPDATE. Jednak w tym przypadku, gdy należy wykonać procedurę przechowywaną, pojedyncze polecenie SQL nie będzie działać.
Utwórz zmienną tabelową taką jak ta (jeśli pracujesz z dużą ilością danych lub brakuje pamięci, użyj tabeli tymczasowej ):
DECLARE @menus AS TABLE (
id INT IDENTITY(1,1),
parent NVARCHAR(128),
child NVARCHAR(128));
To id
jest ważne.
Zastąpić parent
i child
niektórych danych dobrych, np odpowiednimi identyfikatorami lub całego zbioru danych, które mają być eksploatowane na.
Wstaw dane do tabeli, np .:
INSERT INTO @menus (parent, child)
VALUES ('Some name', 'Child name');
...
INSERT INTO @menus (parent,child)
VALUES ('Some other name', 'Some other child name');
Zadeklaruj niektóre zmienne:
DECLARE @id INT = 1;
DECLARE @parentName NVARCHAR(128);
DECLARE @childName NVARCHAR(128);
Na koniec utwórz pętlę while nad danymi w tabeli:
WHILE @id IS NOT NULL
BEGIN
SELECT @parentName = parent,
@childName = child
FROM @menus WHERE id = @id;
EXEC myProcedure @parent=@parentName, @child=@childName;
SELECT @id = MIN(id) FROM @menus WHERE id > @id;
END
Pierwszy wybór pobiera dane z tabeli tymczasowej. Drugi wybór aktualizuje @id.MIN
zwraca null, jeśli nie wybrano żadnych wierszy.
Alternatywnym podejściem jest zapętlenie, gdy tabela ma wiersze, SELECT TOP 1
i usunięcie wybranego wiersza z tabeli temp:
WHILE EXISTS(SELECT 1 FROM @menuIDs)
BEGIN
SELECT TOP 1 @menuID = menuID FROM @menuIDs;
EXEC myProcedure @menuID=@menuID;
DELETE FROM @menuIDs WHERE menuID = @menuID;
END;