在SQL

问题描述:

从游标读取记录,我有记录名单,并已通过每个记录创建游标循环,并检查某些条件并返回记录,如果它满足我的光标如下:在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

你的问题是什么?游标正在提取错误的数据?你能显示源数据吗? – 2013-03-04 05:58:12

+0

我想从循环中获取id = 839的记录,请参阅我在代码中注释了select语句,在那里我想写select语句只返回一个记录,其中id是839我该怎么做 – DharaPPatel 2013-03-04 06:02:11

+0

仍然没有'没有得到它。为什么你用光标呢?只要使用SELECT语句和WHERE子句 – 2013-03-04 06:09:00

替换你的光标,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 2013-03-17 07:09:51

既然你有日期的列表,你应该声明光标该列表,而不是为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代码

@Zooz你的想法是不够好,如果删除了一些记录过去,索引有问题,因为索引对where子句没有正确的值。 和一个表通常有一些删除的记录。