2013-03-04 2 views
5

У меня есть список записей, и создал курсор Переберите каждую запись и проверить определенное состояние и вернуть запись, если она удовлетворяет мой курсор выглядит следующим образом:выборки записей из курсора в SQL

DECLARE @ID int 
DECLARE @FromDate datetime, @ToDate datetime 
DEClare @expid as int 
set @expid = 839 
DECLARE IDs CURSOR FOR 
select patpid,fromdate,todate from tdp_ProviderAccomodationTariffPlan where fk_patid = 162 and fk_pacid = 36 

OPEN IDs 
FETCH NEXT FROM IDs into @ID,@FromDate,@ToDate 
WHILE @@FETCH_STATUS = 0 
BEGIN 
print @ID 
print @FromDate 
print @ToDate 

--SELECT patpid,rate,SType FROM tdp_ProviderAccomodationTariffPlan 
--WHERE ('2012-12-27' BETWEEN @FromDate AND @ToDate) and fk_patid = 162 and fk_pacid = 36 

FETCH NEXT FROM IDs into @ID,@FromDate,@ToDate 

END 
CLOSE IDs 
DEALLOCATE IDs 

в курсоре контура выборки запись с идентификатором «839», пожалуйста, помогите мне решить проблему.

+0

В чем проблема? Курсор выводит неверные данные? Можете ли вы показать исходные данные? –

+0

Я хочу получить запись, которая имеет id = 839 из цикла, см. Я прокомментировал инструкцию select в коде, где я хочу написать инструкцию select, которая возвращает только одну запись, где id - 839, как это сделать – DharaPPatel

+0

Still didn ' Получить его. Почему вы используете курсор? Просто используйте инструкцию 'SELECT' с предложением WHERE' –

ответ

5

Заменить курсор с WHILE петли, чтобы получить более высокую производительность следующим образом:

select identity(int,1,1) as id, patpid,fromdate,todate 
INTO #temp1 
from tdp_ProviderAccomodationTariffPlan 
where fk_patid = 162 and fk_pacid = 36 

declare @index int 
declare @count int 

select @count = count(*) from @temp1 
set @index = 1 

declare @patpid int 
declare @fromdate datetime 
declare @todate datetime 

while @index <= @count 
begin 

    select @patid = patid, 
     @fromdate = fromdate, 
     @todate = todate 
    from #temp1 
    where id = @index 

    -- do your logic here 

    set @index= @index + 1 
end 

drop table #temp1 
+0

Если вы слишком много записей, подумайте над добавлением индекса во временную таблицу. Это добавит огромную производительность. – ZooZ

3

Поскольку у вас есть список дат, вы должны объявить курсор для этого списка, а не для tdp_ProviderAccomodationTariffPlan:

CREATE TABLE #TEMP_TABLE (PATPID INT, RATE ..., STYPE ...) 
DECLARE @MY_DATE DATETIME, @FromDate DATETIME, @ToDate DATETIME 
SET @FromDate = '...' 
SET @ToDate = '...' 
DECLARE THE_CURSOR CURSOR FOR 
select MY_DATE from YOUR_DATE_LIST 

OPEN THE_CURSOR 
FETCH NEXT FROM THE_CURSOR into @MY_DATE 
WHILE @@FETCH_STATUS = 0 
BEGIN 

INSERT INTO #TEMP_TABLE 
SELECT patpid,rate,SType FROM tdp_ProviderAccomodationTariffPlan 
WHERE (@MY_DATE BETWEEN @FromDate AND @ToDate) and fk_patid = 162 and fk_pacid = 36 

FETCH NEXT FROM THE_CURSOR into @MY_DATE 
END 
CLOSE THE_CURSOR 
DEALLOCATE THE_CURSOR 
select * from #temp_table 
DROP TABLE #TEMP_TABLE 

Но я бы рекомендовал вам избежать использования курсоров. Это проще и быстрее, чтобы сделать это в коде .NET

0

@Zooz ваша идея не достаточно хорошо, если удалены некоторые записи в прошлое, у вас есть проблема с индексом, потому что индекс не имеет правильного значения для вашего предложения where. и таблица часто имеет некоторые удаленные записи.

Смежные вопросы