пример использования петли Microsoft FETCH? - PullRequest
0 голосов
/ 15 мая 2018

Я вижу этот пример в документации Microsoft

USE AdventureWorks2012;  
GO  
DECLARE contact_cursor CURSOR FOR  
SELECT LastName FROM Person.Person  
WHERE LastName LIKE 'B%'  
ORDER BY LastName;  

OPEN contact_cursor;  

-- Perform the first fetch.  
FETCH NEXT FROM contact_cursor;  

-- Check @@FETCH_STATUS to see if there are any more rows to fetch.  
WHILE @@FETCH_STATUS = 0  
BEGIN  
   -- **This is executed as long as the previous fetch succeeds.**  
   FETCH NEXT FROM contact_cursor;  
END  

CLOSE contact_cursor;  
DEALLOCATE contact_cursor;  
GO  

Мне интересно и спрашиваю

а) что происходит внутри цикла FETCH-WHILE? Кажется, он ничего не делает, кроме пропуска комментария. Можно ли что-то сделать с данными, не используя 'INTO'?

б) как получить доступ к данным столбца из текущей строки, внутри цикла, в T-SQL? Желательно просто contact_cursor.LastName.

Да, я читал, что должен работать «на основе множеств», а курсоры не эффективны. Но мне разрешено выполнять обработку (строковые манипулы, тестировать их и, в конце концов, одно ОБНОВЛЕНИЕ на строку) в T-SQL, а не во внешней процедурной среде, и делать это осторожно и надежно, и это всего лишь пара записей, один раз + тестирование. И я совершенно новый для T-SQL, но старый для SQL и многих других. T-SQL - это 2016 год, когда он имеет значение.

Плз Я не могу отвечать как комментарии, потому что мой уровень слишком низкий. Я благодарен за помощь, за объяснение этого. Спасибо!

1 Ответ

0 голосов
/ 15 мая 2018

contact_cursor в этом примере представляет собой упорядоченную коллекцию значений столбцов, которые составляют строку из оператора select.

В этом случае просто LastName.

Если вы хотите что-то сделать сЗначения, которые вам нужны для извлечения их в упорядоченный список переменных.Посмотрите пример чуть ниже того, который вы скопировали в свой вопрос на этой странице: https://docs.microsoft.com/en-us/sql/t-sql/language-elements/fetch-transact-sql?view=sql-server-2017

Чтобы сделать что-то с извлеченными значениями, вы должны помнить, что вы вошли в цикл с уже извлеченным первым значением.Итак, вы разместите здесь любую работу, выполненную здесь:

WHILE @@FETCH_STATUS = 0  
BEGIN  

-- **Do work with previously fetched value(s) here ** 

--  **Fetch next  
FETCH NEXT FROM contact_cursor;  
END

Здесь вы должны заметить небольшую дыру в логикеЧто делать, если рядом нет?Вам также нужно будет выполнить операции с последним значением выборки вне цикла.

В качестве альтернативы:

-- ** Do work on first fetched value
WHILE @@FETCH_STATUS = 0  
BEGIN  

FETCH NEXT FROM contact_cursor;
-- ** Do work on next fetched  
END

Все, что вы можете сделать с простой переменной, вы можете сделать с выбраннойзначения внутри вашего цикла.

Лучшая альтернатива, предложенная Питером в комментариях:

WHILE (1=1)
BEGIN  

FETCH NEXT FROM contact_cursor;

-- ** Do work on next fetched 

IF ( @@FETCH_STATUS <> 0)
    BREAK;
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...