在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',请帮我解决问题。
答
替换你的光标,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子句没有正确的值。 和一个表通常有一些删除的记录。
你的问题是什么?游标正在提取错误的数据?你能显示源数据吗? – 2013-03-04 05:58:12
我想从循环中获取id = 839的记录,请参阅我在代码中注释了select语句,在那里我想写select语句只返回一个记录,其中id是839我该怎么做 – DharaPPatel 2013-03-04 06:02:11
仍然没有'没有得到它。为什么你用光标呢?只要使用SELECT语句和WHERE子句 – 2013-03-04 06:09:00