#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
курсора последовательно?, вы понимаете, что это делает?