Синтаксическая ошибка при объявлении курсора в T-SQL
Я получаю синтаксическую ошибку при попытке запустить приведенный ниже код, чтобы объявить курсор, который проходит через, и распечатать первые 10 ордеров в моем OrderTable
,
Ошибка разбора в строке: 3, столбец: 11: неверный синтаксис рядом с OrderCursor.
Не могли бы вы помочь мне выяснить, что мне здесь не хватает? Или это может быть связано с моей версией базы данных: Microsoft Azure SQL Data Warehouse - 10.0.9999.0 n?
Спасибо за вашу помощь
DECLARE @Order VARCHAR(11)
DECLARE @Variant INT
DECLARE OrderCursor CURSOR FOR
SELECT TOP 10 ORDER_ID, Variant
FROM OrderTable
OPEN OrderCursor
FETCH NEXT FROM OrderCursor INTO @Order, @Variant
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Order no:' + @Order + @Variant
FETCH NEXT FROM OrderCursor INTO @Order, @Variant
END
CLOSE OrderCursor
DEALLOCATE OrderCursor
2 ответа
Хранилище данных SQL Azure не поддерживает курсоры. Смотрите здесь советы о том, как заменить их на петли. Надеюсь, излишним, но просто процитировать первый значимый абзац из ссылки:
Однако, прежде чем погрузиться в голову, вы должны задать себе следующий вопрос: "Может ли этот курсор быть переписан для использования операций на основе множества?". Во многих случаях ответ - да, и часто это лучший подход. Операция на основе множества часто выполняется быстрее, чем итеративный, построчный подход.
Хранилище данных Microsoft Azure SQL не поддерживает курсоры. Так сказано прямо в верхней части документации:
ОБЪЯВИТЬ КУРСОР (Transact-SQL)
ПРИМЕНИМО к: V SQL Server (начиная с 2008 г.) V База данных SQL Azure X Хранилище данных SQL Azure X Параллельное хранилище данных
Тем не менее, курсор в любом случае обычно является чем-то, чего вы хотите избежать в SQL.
Фактически, после 20 лет разработки программного обеспечения я, вероятно, могу рассчитывать, с одной стороны, сколько раз я использовал курсоры, а на трех пальцах - сколько раз это было оправдано.
Если бы вы могли создать вопрос, который покажет реальную проблему, с которой вы имеете дело (я полагаю, что на самом деле она не пытается печатать), я уверен, что кто-то здесь сможет помочь вам получить решение на основе множеств вместо использования курсор.