2013-03-04 8 views
5

mam listę rekordów i stworzyli kursor pętli każdego rekordu i sprawdzić pewien warunek i rekord powrócić, jeśli spełnia mój kursor jest w następujący sposób:rekord pobrać od kursora w 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 

w kursora pętli pobrania rekord, którego identyfikator to "839", pomóż mi rozwiązać problem.

+0

Jaki jest twój problem? Kursor pobiera złe dane? Czy możesz pokazać dane źródłowe? –

+0

Chcę pobrać rekord, który ma identyfikator = 839 z pętli, zobacz komentarz, który został zaznaczony w kodzie, w którym chcę napisać instrukcję select, która zwraca tylko jeden rekord, gdzie id to 839, jak to zrobić, – DharaPPatel

+0

Still didn ' t dostań to. Dlaczego zatem używasz kursora? Po prostu użyj instrukcji 'SELECT' z klauzulą" WHERE "klauzula –

Odpowiedz

5

Wymień kursor z pętli while, aby uzyskać większą wydajność, co następuje:

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

Jeśli mieć zbyt wiele rekordów, należy rozważyć dodanie indeksu do tabeli tymczasowej. Pozwoli to na znaczne zwiększenie wydajności. – ZooZ

3

Skoro masz wykaz dat, należy zadeklarować kursor na tej liście, nie dla 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 

Ale polecam Ci uniknąć używania kursorów. Łatwiej i szybciej zrobić to w kodzie .NET

0

@Zooz Twój pomysł nie jest wystarczająco dobre, jeśli usunięty jakiś rekord w przeszłości masz problem z indeksem, ponieważ indeks ma niepoprawną wartość dla twojego zdania where. i tabela często zawiera kilka usuniętych rekordów.

Powiązane problemy