2009-08-19 9 views
7

Używam programu SQL Server do budowania procedur przechowywanych i używam kursory pętli selectJak uzyskać dostęp do kolumn kursora .. Bez FETCH INTO

mam definiującej kursor następująco:

DECLARE @c_col1 varchar(max); 
DECLARE @c_col2 varchar(max); 

DECLARE c as CURSOR FOR 
SELECT col1, col2 
FROM table; 

OPEN c; 
FETCH NEXT FROM c INTO 
@c_col1, @c_col2; 

SELECT @c_col1, @c_col2; 

Czy istnieje sposób dostępu do kolumn kursora bez potrzeby zadeklarowania zmiennych dla każdej kolumny i użycia INTO w klauzuli FETCH? Innymi słowy, jest to możliwe do wykorzystania:

DECLARE c as CURSOR FOR 
SELECT col1, col2 
FROM table; 

OPEN c; 
FETCH NEXT FROM c; 

SELECT c.col1, c.col2; 
+0

Dlaczego musisz używać kursorów? Powinieneś naprawdę spróbować znaleźć alternatywę opartą na zestawie przy użyciu SQL, ponieważ to właśnie bazy danych są dobre w przetwarzaniu. Często kod kursora jest znacznie wolniejszy niż równoważny kod SQL. – pjp

+2

@pjp, czasami kursory są przydatne do uruchamiania złożonej logiki w trybie rząd po rzędzie, często przez wywołanie procedury składowanej dla każdego zwróconego wiersza. Ponadto, jeśli potrzebujesz czegoś takiego jak usunięcie kilku milionów wierszy, pojedyncze zapytanie oparte na zestawie może blokować twoją bazę danych przez długi czas. Usuwanie jednego wiersza za jednym razem za pomocą kursora zajmuje dużo więcej czasu, ale pozwala bazy danych oddychać, gdy to się dzieje. –

+0

możesz zapętlić i przetworzyć dane bez kursora. Możesz uzyskać ogromne ulepszenia wydajności, zastępując kursory operacjami opartymi na zestawie. Jednak zastąpiłem użycie kursorów, ale nadal zapętlono (ponieważ było to naprawdę konieczne) i wciąż widziałem duże zyski wydajności. –

Odpowiedz

1

Nie, trzeba zrobić to w ten sposób, jeśli chcesz przechowywać wartości od kursora w zmiennych lokalnych zamiast wrócić z powrotem do klienta.

+0

z kodu OP, zwracają wartości jako 1 wiersz zestaw wierszy z dwiema kolumnami –

0

jeśli jest to twój cały porcedure (prawo od PO pytanie):

DECLARE @c_col1 varchar(max); 
DECLARE @c_col2 varchar(max); 

DECLARE c as CURSOR FOR 
SELECT col1, col2 
FROM table; 

OPEN c; 
FETCH NEXT FROM c INTO 
@c_col1, @c_col2; 

SELECT @c_col1, @c_col2; 

następnie można po prostu wykonaj następujące czynności, aby wrócić zestaw wyników z dwóch kolumn, bez kursora konieczne:

SELECT top 1 col1, col2 
FROM table; 
Powiązane problemy