2016-11-07 86 views
-1

這是我現在有,但我仍然收到錯誤:打開此查詢到光標

消息16916,級別16,狀態1,239線 名爲「sumCurSalaryActiveEmps」確實光標不存在。
Msg 16917,Level 16,State 2,Line 258 光標未打開。
消息16916,級別16,狀態1,行266 名稱爲'sumCurSalaryActiveEmps'的遊標不存在。
消息16916,級別16,狀態1,行267 名稱爲'sumCurSalaryActiveEmps'的遊標不存在。

DECLARE @sumCurSal decimal(10,2) 
DECLARE sumCurSalaryActiveEmp CURSOR Local FAST_FORWARD FOR 
SELECT 
SUM(Salary.Emp_Salary) AS 'Sum of All Current Salaries' 

    FROM 
    (
    SELECT 

     MAX(Emp_Salary_Change_Year) AS "Change Year" 
     FROM Employee_Details AS e 

    INNER JOIN Country AS co ON e.Emp_Country_Id = co.Country_Id 
    INNER JOIN State AS s ON e.Emp_State_Id = s.State_Id 
    INNER JOIN Designation AS d ON e.Desig_Id = d.Desig_Id 
    INNER JOIN Salary AS sa ON e.Emp_Id = sa.Emp_Id 
    WHERE Emp_Active = 1 
    GROUP BY Emp_First_Name, Emp_Last_Name, 
    Emp_Middle_Name, Country_Name, Desig_Name) AS C 
    INNER JOIN Salary ON C.[Change Year] = Salary.Emp_Salary_Change_Year 
    OPEN sumCurSalaryActiveEmps 
    Fetch NEXT FROM sumCurSalaryActiveEmp 
    INTO @sumCurSal 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     Fetch NEXT FROM sumCurSalaryActiveEmps 
      INTO @sumCurSal 
      END 
    close sumCurSalaryActiveEmps 
    Deallocate sumCurSalaryActiveEmps 
+1

你應該**不惜一切代價避免遊標 - 不學會創建和使用它們! –

+3

你想達到什麼目的?看起來你只會得到1行。所有工資總和。你爲什麼需要光標? –

+2

Sql Server不是oracle。不要在99.99999%的時間內使用遊標。你應該讀作「我不應該使用遊標」。忘記你甚至發現這篇文章:http://www.dotnettricks.com/learn/sqlserver/sql-server-basics-of-cursors – granadaCoder

回答

0

我同意所有誰說你不應該使用一般的遊標的鄉親。當你真的,真的需要一個時,它就少了1%。但是,要回答你的問題,這是一個你可以用於遊標的模板。

Declare sumCurSalaryActiveEmp Cursor Local Fast_Forward For 
    -- Your select statement here. For each column selected you need a corresponding variable to FETCH into 

Open sumCurSalaryActiveEmp 
Fetch Next From sumCurSalaryActiveEmp 
    Into @sumCurSal -- YOU DECLARE These to match up to your select 

While @@FETCH_STATUS = 0 
    Begin 
    -- Do your stuff here 
    Fetch Next From sumCurSalaryActiveEmp 
     Into @sumCurSal 
    End 

Close sumCurSalaryActiveEmp 
Deallocate sumCurSalaryActiveEmp 

在您的特定代碼中,您需要在OPEN語句之前刪除關鍵字GO。