我有记录列表,并创建了游标循环遍历每条记录并检查某些条件并返回记录,如果它满足我的光标如下:
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
在循环光标提取记录中,其id为' 839' ,请帮我解决问题。
答案 0 :(得分:6)
将光标替换为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
答案 1 :(得分: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代码中执行此操作更容易,更快捷
答案 2 :(得分:0)
答案 3 :(得分:0)
ALTER PROCEDURE [dbo].[SP_UpdateEmpStatus_IfLastAttDateMoreThan50]
(
@Msg NVARCHAR(MAX)=null OUTPUT
)
AS
BEGIN
/**Declare Cursor**/
DECLARE @TCursor CURSOR
/**Declare Cursor**/
DECLARE @EmpCode bigint=null,@maxAttDate DATE=null,@totDays INT=null
/**Creating TempDetails Table**/
CREATE TABLE #TempDetails
(EmpCode BIGINT,maxAttDate DATE,totDays int)
/**Creating TempDetails Table**/
INSERT INTO #TempDetails(EmpCode,maxAttDate,totDays)
(
SELECT EmpCode,MAX( LastAttDate) AS maxAttDate,(DATEDIFF(DAY,MAX( LastAttDate),GETDATE())) As totDays FROM tbl_EmpdutyDays
WHERE EmpCode IN (SELECT DISTINCT EmpCode FROM tbl_Set_EmpWiseValidations WHERE Status=1)
GROUP BY EmpCode
)
SET @TCursor =CURSOR FOR SELECT EmpCode,maxAttDate,totDays FROM #TempDetails
OPEN @TCursor
FETCH NEXT FROM @TCursor INTO @EmpCode,@maxAttDate,@totDays
WHILE @@FETCH_STATUS=0
BEGIN
IF(@totDays IS NOT NULL)
BEGIN
IF (@totDays>=50)
BEGIN
UPDATE tbl_Set_EmpRestric
SET [Status]=0
WHERE EmpCode=@EmpCode
UPDATE tbl_Employees
SET [Status]=0
WHERE EmpCode=@EmpCode
END
END
FETCH NEXT FROM @TCursor INTO @EmpCode,@maxAttDate,@totDays
END
SET @Msg='more Than 50 days Deactived Successfully.'
DEALLOCATE @TCursor
SELECT * FROM #TempDetails
DROP TABLE #TempDetails
END