Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule opisano różne metody, których można użyć do iterowania zestawu wyników przy użyciu języka Transact-SQL w programie SQL Server.
Oryginalna wersja produktu: SQL Server
Oryginalny numer KB: 111401
Podsumowanie
W tym artykule opisano różne metody, których można użyć do symulowania logiki przypominającej FETCH-NEXT kursor w partii składowanej, wyzwalacza lub transact-SQL.
Używanie instrukcji Języka Transact-SQL do iterowania po zestawie wyników
Poniżej przedstawiono trzy metody, których można użyć do iterowania zestawu wyników przy użyciu instrukcji Języka Transact-SQL. W poniższych przykładach użyto tabeli Production.Product z przykładowej bazy danych AdventureWorks
Jedną z metod jest użycie tabel tymczasowych. Za pomocą tej metody utworzysz migawkę początkowej SELECT instrukcji i użyjesz jej jako podstawy do kursora. Na przykład:
/********** example 1 **********/
SET NOCOUNT ON
DROP TABLE IF EXISTS #MYTEMP
DECLARE @ProductID int
SELECT * INTO #MYTEMP FROM Production.Product
SELECT TOP(1) @ProductID = ProductID FROM #MYTEMP
WHILE @@ROWCOUNT <> 0
BEGIN
SELECT * FROM #MYTEMP WHERE ProductID = @ProductID
DELETE FROM #MYTEMP WHERE ProductID = @ProductID
SELECT TOP(1) @ProductID = ProductID FROM #MYTEMP
END
Drugą metodą jest użycie min funkcji do chodzenia tabeli po jednym wierszu naraz. Ta metoda przechwytuje nowe wiersze, które zostały dodane po rozpoczęciu wykonywania procedury składowanej, pod warunkiem, że nowy wiersz ma unikatowy identyfikator większy niż bieżący wiersz, który jest przetwarzany w zapytaniu. Na przykład:
/********** example 2 **********/
SET NOCOUNT ON
DROP TABLE IF EXISTS #MYTEMP
DECLARE @ProductID int
SELECT @ProductID = min( ProductID ) FROM Production.Product
WHILE @ProductID IS NOT NULL
BEGIN
SELECT * FROM Production.Product WHERE ProductID = @ProductID
SELECT @ProductID = min( ProductID ) FROM Production.Product WHERE ProductID > @ProductID
END
Uwaga 16.
W obu przykładach 1 i 2 przyjęto założenie, że istnieje unikatowy identyfikator dla każdego wiersza w tabeli źródłowej. W niektórych przypadkach nie może istnieć unikatowy identyfikator. Jeśli tak jest, możesz zmodyfikować metodę tabeli tymczasowej, aby użyć nowo utworzonej kolumny klucza. Na przykład:
/********** example 3 **********/
SET NOCOUNT ON
DROP TABLE IF EXISTS #MYTEMP
SELECT NULL AS mykey, * INTO #MYTEMP FROM Production.Product
UPDATE TOP(1) #MYTEMP SET mykey = 1
WHILE @@ROWCOUNT > 0
BEGIN
SELECT * FROM #MYTEMP WHERE mykey = 1
DELETE FROM #MYTEMP WHERE mykey = 1
UPDATE TOP(1) #MYTEMP SET mykey = 1
END