2013-03-04 27 views
5

tôi có danh sách các hồ sơ và đã tạo ra con trỏ để lặp qua mỗi bản ghi và kiểm tra điều kiện nhất định và trả lại hồ sơ mà nếu nó đáp ứng con trỏ của tôi là như sau:lấy hồ sơ từ con trỏ trong 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 

trong con trỏ vòng lặp lấy bản ghi có id là '839', Vui lòng giúp tôi giải quyết vấn đề.

+0

Vấn đề của bạn là gì? Con trỏ đang tìm nạp dữ liệu sai? Bạn có thể hiển thị dữ liệu nguồn không? –

+0

tôi muốn lấy bản ghi có id = 839 từ vòng lặp, xem tôi đã nhận xét câu lệnh chọn trong mã mà tôi muốn viết câu lệnh chọn chỉ trả về một bản ghi trong đó id là 839 làm cách nào để làm điều đó – DharaPPatel

+0

Tôi hiểu rồi. Tại sao bạn sử dụng con trỏ? Chỉ cần sử dụng câu lệnh 'SELECT' với mệnh đề' WHERE' –

Trả lời

5

Thay con trỏ của bạn với vòng lặp while để đạt được hiệu suất nhanh hơn như sau:

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

Nếu bạn có quá nhiều bản ghi, hãy xem xét thêm chỉ mục vào bảng tạm thời. Điều này sẽ tăng cường hiệu suất rất lớn. – ZooZ

3

Vì bạn có danh sách các ngày, bạn nên khai báo con trỏ cho danh sách đó, không cho 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 

Nhưng tôi sẽ khuyên bạn nên tránh sử dụng con trỏ. Nó dễ dàng hơn và nhanh hơn để làm điều đó trong mã NET

0

@Zooz ý tưởng của bạn là không đủ tốt, nếu xóa một số kỷ lục trong quá khứ, bạn có vấn đề với chỉ mục vì chỉ mục không sửa giá trị cho mệnh đề where của bạn. và một bảng thường có một số bản ghi đã xóa.

Các vấn đề liên quan