Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Хранимая процедура неправильно отрабатывает


Автор: Leklerk 19.3.2012, 19:12
Добрый день! Работаю в SQL Server 2005, запускаю хранимую процедуру, о она вставляет последнюю запись курсора 2 раза вместо одного. Подскажите, что не так? 
Код

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
 
ALTER procedure [dbo].[Вставка_Табель_малая]
 
AS    
 
DECLARE @Компьютер  VARCHAR(30)
 
DECLARE КурсорПользователи CURSOR
FOR SELECT Компьютер FROM Пользователи
 
OPEN КурсорПользователи
 
WHILE @@Fetch_Status = 0 BEGIN
    FETCH КурсорПользователи INTO @Компьютер
    INSERT INTO Табель_малая VALUES(
        @Компьютер,
        Convert(VARCHAR(30),Getdate(),104),
        '',
        '',
        1)
END

Автор: Zloxa 19.3.2012, 19:43
@@Fetch_Status возвращает статус последнего фетча. Проверяя его до вашего фетча, вы проверяете статус какого-то чужого фетча. На втором витке цикла вы уже проверяете статус своего фетча.

добавьте 
Код

FETCH КурсорПользователи INTO @Компьютер

перед началом цикла.

Автор: Leklerk 20.3.2012, 12:32
Нет, так не работает. Работает, если кроме того поставить этот код перед END (вместо перед INSERT).

Автор: Zloxa 20.3.2012, 14:20
Цитата(Leklerk @  20.3.2012,  13:32 Найти цитируемый пост)
Нет, так не работает. 

Да, еще исходный фетч надо переместить после инсерта.
Цитата(Leklerk @  20.3.2012,  13:32 Найти цитируемый пост)
Работает, если кроме того поставить этот код перед END (вместо перед INSERT).

Попробуйте как это будет работать в случае, если курсор не вернет ни одного значения.
Или я вас не так понял, вы так и сделали?
Один фетч перед while, один фетч перед end.

Автор: Leklerk 20.3.2012, 16:51
Да, именно так. Но я нашел другое решение (точнее, мне помогли), без курсоров:
Код

ALTER procedure [dbo].[Вставка_Табель_малая]
AS    

    INSERT INTO Табель_малая 
    SELECT Компьютер, Convert(VARCHAR(30),Getdate(),104), '', '', 1
    FROM Пользователи

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)