2015-07-22 181 views
-1

我有一個sql問題。下面我從考勤表中獲得的數據。 有時它會檢入數據,有時還會檢出數據。休息它有一個空值。我有一個存儲過程,它有一個返回下面的輸出表(2)的遊標。SQL代碼優化

我需要使用select語句刪除遊標。以便我可以優化sql代碼。此外,該表沒有任何主鍵。 你能幫我一樣嗎。

數據庫表扣

<table border="0" cellpadding="2" cellspacing="4" > 
 
     
 
     <tr > 
 
      <td >checkIn</td> 
 
      <td >checkout</td> 
 
     </tr> 
 
     <tr > 
 
      <td >7/22/2015 11:30</td> 
 
      <td>null</td> 
 
     </tr> 
 
     <tr > 
 
      <td >null</td> 
 
      <td>null</td> 
 
     </tr> 
 
     <tr > 
 
      <td >null</td> 
 
      <td >7/22/2015 20:30</td> 
 
     </tr> 
 
     <tr > 
 
      <td >7/21/2015 10:30</td> 
 
      <td>null</td> 
 
     </tr> 
 
     <tr > 
 
      <td >null</td> 
 
      <td>null</td> 
 
     </tr> 
 
     <tr > 
 
      <td >null</td> 
 
      <td >7/21/2015 14:30</td> 
 
     </tr> 
 
     <tr > 
 
      <td ></td> 
 
      <td></td> 
 
     </tr> 
 
     <tr > 
 
      <td ></td> 
 
      <td></td> 
 
     </tr> 
 
     <tr > 
 
      <td>checkin</td> 
 
      <td >checkout<tr> 
 
     <tr > 
 
      <td >7/22/2015 11:30</td> 
 
      <td >7/22/2015 20:30</td> 
 
     </tr> 
 
     <tr > 
 
      <td >7/21/2015 10:30</td> 
 
      <td >7/21/2015 14:30</td> 
 
     </tr> 
 
    </table>

感謝

+0

遊標並不總是不好。靜態fast_forward光標是最快的光標之一,有時它甚至會執行while循環。在完成離開光標之前,您可以先嚐試使用靜態fast_forward光標。 請添加更多關於考勤表和存儲過程的細節,尤其是光標部分。它會幫助他人更好地理解你的問題並給出適當的答案。 –

+0

顯示'CURSOR'代碼和一些基於哪個'CURSOR'構建給定的樣本數據。 – gotqn

+0

因爲您沒有提供任何建議,因此不可能提供任何建議。請包括表格結構,索引,行計數和樣本數據與預期的結果,最好在SQL小提琴。 –

回答

0

我使用的代碼是這樣的一個,以任何機會,我們可以在一組,因爲客戶端的select語句的包裝這個代碼建議從代碼中刪除遊標。感謝您對這篇文章的幫助。

DECLARE @checkIn varchar(50), @checkOut varchar(50) 
CREATE TABLE #LocalTemp 
(
Cekckintime Datetime, 
checkouttime Datetime, 
) 
DECLARE @tmpCkin datetime,@tmpCkout datetime 

DECLARE cursorName CURSOR 
LOCAL SCROLL STATIC 
FOR 
    Select Cekckintime, checkouttime FROM attendancetable 
    OPEN cursorName 
     FETCH NEXT FROM cursorName INTO @checkIn, @checkOut 

     WHILE @@FETCH_STATUS = 0 
     BEGIN 

      if @checkIn is not null 
       begin 
        set @tmpCkin = @checkIn 
       end 
      else 
       begin 
        if @checkOut is not null 
         begin 
          set @tmpCkout [email protected] 
         end 
       end 

       if @tmpCkin is not null and @tmpCkout is not null 
       begin 
        insert into #LocalTemp values (@tmpCkin,@tmpCkout) 
        set @tmpCkin = null 
        set @tmpCkout = null 
       end 
      -- other Bussiness Logic 
      FETCH NEXT FROM cursorName INTO @checkIn, @checkOut 
      PRINT @checkIn + ' ' + @checkOut 
     END 
     select * from #LocalTemp 
     drop TABLE #LocalTemp 
CLOSE cursorName 
DEALLOCATE cursorName 
0

我想我可以通過使用下面的查詢清理光標代碼,這將映射確切的入住時間和退房時間

select a.cekckInTime, b.CheckOutTime from 
(select ROW_NUMBER() Over( ORDER BY CekckInTime) as Id, * from attendancetable where cekckInTime is not null) a 
inner join 
(select ROW_NUMBER() Over( ORDER BY CheckOutTime) as Id, * from attendancetable where CheckOutTime is not null) b 
on a.Id =b.Id 

請不要讓我知道如果任何進一步的優化是可能的。