У меня есть следующий запрос, я хочу использовать вложенный курсор в моем запросе. Как это сделать, потому что оно не работает, и я новичок в SQL Server. Пожалуйста, помогите мнеКак использовать курсор внутри курсора в SQL Server?
CHECK TABLE SUGGEST LAT 31.8181 LONG 71.4146
Msg 16915, уровень 16, состояние 1, процедура Sp_CheckCarStatusMeter, Линия курсор с именем 'ShapeCursor' уже существует. ELSE ОТКРЫТЫЙ CURSOR
Msg 16905, уровень 16, состояние 1, процедура Sp_CheckCarStatusMeter, линии 296
Курсор уже открыт.
Код:
DECLARE SuggestCursor CURSOR FOR
SELECT TOP 100
rtha.car_id, rtha.latitude, rtha.longitude
FROM
Carhistory rtha
WHERE
rtha.car_id = 6142 ;
OPEN SuggestCursor;
FETCH NEXT FROM SuggestCursor INTO @CarSuggested, @carlatprevious, @carlongprevious;
WHILE (@@FETCH_STATUS = 0)
BEGIN
PRINT 'CHECK TABLE SUGGEST LAT '[email protected] +' LONG '+ @carlongprevious;
DECLARE ShapeCursor CURSOR FOR
SELECT
g.ID, @carID, g.ShapeType
FROM
tblgeo AS g
WHERE
car_id @ID;
IF (SELECT CURSOR_STATUS('local','ShapeCursor')) >= -1
BEGIN
Print 'DEALLOCATE CURSOR'
--DEALLOCATE ShapeCursor
END
ELSE
Print 'ELSE OPEN CURSOR'
OPEN ShapeCursor;
FETCH NEXT FROM ShapeCursor INTO @ID, @CarIdx, @ShapeType;
WHILE (@@FETCH_STATUS = 0)
BEGIN
Нам нужно будет увидеть больше кода, чтобы убедиться, поскольку вы показываете только верхнюю часть. Поскольку вы объявляете курсор в цикле, очевидная проблема заключается в том, что вы также не освобождаете его в каждом цикле цикла. При этом, и особенно, поскольку вы говорите, что вы новичок в SQL, курсоры, как правило, лучше избегать, если все другие возможности не были исследованы, а * вложенные * курсоры редко, если вообще когда-либо, являются правильным решением проблемы. Если бы вы могли описать свою * цель *, а также некоторые примеры данных и ожидаемые результаты, мы можем предложить решение, которое вообще не использует курсоры. –
Курсоры злы. Вложенные курсоры даже хуже. Если у вас действительно нет другого выбора, не используйте их вообще. Сказав это, если вы действительно должны использовать вложенные курсоры, внутренний курсор должен быть объявлен (и освобожден) за пределами цикла внешнего курсора. –
[xy problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) – Bridge