SQL SERVER: ВЫБОРКА КУРСОРА вызывает ошибку, в то время как идентичная строка работает нормально

#sql-server #cursor #fetch

#sql-server #курсор #выборка

Вопрос:

контекст

Я работаю над базой данных SQL Server для своих исследований в области электронной мобильности. В этой базе данных мы храним сеансы зарядки электромобилей в Нидерландах. Частью ETL является преобразование записанных сеансов начисления в новую таблицу, в которой хранится время (прибытия) между сеансами начисления.

проблема

Я использую курсор crChargeSessions , в котором я ИЗВЛЕКАЮ столбцы в переменные. Я делаю это 3 раза. Сначала выборка в переменных с именем @old[etc] затем @new [etc] и, наконец, снова в @new [etc]. t SQL server отображает ошибку в этой последней строке ВЫБОРКИ, в то время как эта строка является полной копией другой строки. Как возможно, что строка, которая работает в первую очередь, не работает несколькими строками позже??

примечание: я удалил объявления @variable для улучшения удобства чтения, ИСПОЛЬЗУЯ [CHIEF_Production] ОБЪЯВЛЕНИЕ crChargeStation ПРОКРУТКА КУРСОРА ДЛЯ ВЫБОРА [PostalCode],[Nr] ИЗ [dbo].TBL_ChargeSessions ГРУППИРУЮТСЯ ПО [PostalCode],[Nr]

  OPEN crChargeStation

 FETCH NEXT FROM crChargeStation
 INTO @strPostalCode ,@strNumber

WHILE @@FETCH_STATUS = 0 
BEGIN

    DECLARE crChargeSessions CURSOR FOR 
    SELECT [ChargeSession_ID]
        ,[PostalCode]
        ,[Nr]     
        ,[RFID]
        ,[StartConnectionDate]
        ,[StartConnectionTime]
        ,[EndConnectionDate]
        ,[EndConnectionTime]
        ,[kWh]
    FROM [dbo].TBL_ChargeSessions 
    WHERE [PostalCode] = @strPostalCode AND [Nr] = @strNumber AND ([LambdaSyncRFID] = 0)
    ORDER BY  [EndConnectionDate] ASC ,  [StartConnectionTime] ASC

    OPEN crChargeSessions
  

ПЕРВЫЙ РАЗ, КОГДА я ИЗВЛЕКАЮ

 FETCH NEXT FROM crChargeSessions    INTO @LastChargeSession_ID, @strPostalCode, @strNumber ,@strLastRFID ,@dtlastStartConnectionDate ,@dtLastStartConnectionTime, @dtlastEndConnectionDate, @dtLastEndConnectionTime, @LastkWh
  

ВТОРОЙ РАЗ я ИЗВЛЕКАЮ

 FETCH NEXT FROM crChargeSessions    INTO @NewChargeSession_ID,  @strPostalCode, @strNumber ,@strNewRFID  ,@dtNewStartConnectionDate ,@dtNewStartConnectionTime, @dtNewEndConnectionDate, @dtNewEndConnectionTime, @NewkWh

    WHILE @@FETCH_STATUS = 0 
    BEGIN   


        SET @dcDeltaBBConnection = CAST ((@dtNewStartConnectionDate   @dtNewStartConnectionTime) - (@dtlastStartConnectionDate   @dtLastStartConnectionTime) as decimal(18,6))
        SET @dcDeltaEBConnection = CAST ((@dtNewStartConnectionDate   @dtNewStartConnectionTime) - (@dtlastEndConnectionDate   @dtLastEndConnectionTime) as decimal(18,6))

            PRINT @strChargeStation

        INSERT INTO [dbo].[TBL_Lambda_ChargeStation]
           ([Nr]
           ,[PostalCode]
           ,[LastRFID]
           ,[NewRFID]
           ,[LastStartConnectionDate]
           ,[LastStartConnectionTime]
           ,[NewStartConnectionDate]
           ,[NewStartConnectionTime]
           ,[deltaBeginBegin]
           ,[deltaEndBegin]
           ,[LastkWh]
           ,[NewkWh])
       VALUES
            (@strNumber
            ,@strPostalCode
            ,@strLastRFID
            ,@strNewRFID
            ,FORMAT(@dtlastStartConnectionDate ,'MM-dd-yyyy')
            ,FORMAT(@dtLastStartConnectionTime  ,'hh:mm:ss' )
            ,FORMAT(@dtNewStartConnectionDate ,'MM-dd-yyyy')
            ,FORMAT(@dtNewStartConnectionTime,'hh:mm:ss')
            ,@dcDeltaBBConnection 
            ,@dcDeltaEBConnection
            ,@LastkWh
            ,@NewkWh)

        -- UPDATE boolean 
            UPDATE [dbo].[TBL_ChargeSessions] SET [LambdaSyncStation] = 1 WHERE [dbo].[TBL_ChargeSessions].[ChargeSession_ID] = @lastChargeSession_ID


            SET @strLastRFID = @strNewRFID
            SET @dcDeltaBBConnection = 0
            SET @dcDeltaEBConnection = 0
            SET @lastChargeSession_ID =  @NewChargeSession_ID
            SET @dtlastStartConnectionDate =  @dtNewStartConnectionDate
            SET @dtLastStartConnectionTime =  @dtNewStartConnectionTime
            SET @dtlastEndConnectionDate =  @dtNewEndConnectionDate
            SET @dtLastEndConnectionTime =  @dtNewEndConnectionTime
            SET @LastkWh =  @NewKWh
  

В ТРЕТИЙ РАЗ Я
ИЗВЛЕКАЮ СЛЕДУЮЩУЮ ВЫБОРКУ ИЗ crChargeSessions В @NewChargeSession_ID, @strPostalCode, @strNumber,@strNewRFID,@dtNewStartConnectionDate ,@dtNewStartConnectionTime, @dtNewEndConnectionDate, @dtNewEndConnectionTime, @NewkWh

     END

    CLOSE crChargeSessions
    DEALLOCATE crChargeSessions 


    FETCH NEXT FROM crChargeStation
    INTO @strChargeStation 
END


CLOSE crChargeStation
DEALLOCATE crChargeStation 
  

ЗАВЕРШЕНИЕ

Комментарии:

1. Что вы имеете в виду, когда эта строка является полной копией другой строки ?, вы хотите сказать, что в вашей таблице 3 одинаковые строки?

2. Если вы опубликуете более подробную информацию, кто-нибудь сможет продемонстрировать версию, которая не требует курсоров.

3. Спасибо за ответ. с полной копией я имел в виду, что эта 3-я строка является точной копией 2-й строки.

4. @AlexK. Спасибо за это предложение, но я бы предпочел сохранить свой код с курсорами в данный момент, поскольку у меня есть другая версия этой хранимой процедуры для другой таблицы, которая работает идеально…

5. @JRHelmus Ну, ваш вопрос как-то значительно изменился, добавив эту часть кода : FETCH NEXT FROM crChargeStation INTO @strChargeStation . Предполагается, что курсор должен получать выборку из 2 столбцов, а не из одного, отсюда и ваша ошибка. В несвязанном примечании, почему вы выполняете 2 выборки из crChargeSessions курсора последовательно?, вы понимаете, что это делает?