2013-05-07 47 views
0

我想創建SQL Server Management Studio中存儲的過程,它有一個與條款。聲明一個SQL遊標與-AS子句

而且我想用SQL遊標與條款。

我的存儲過程是:

ALTER PROCEDURE [dbo].[spGetAllCandidatesEmployeesByOrgId]    
    @ip_OrgId as int,    
    @Active_XML as Bit 

WITH q AS 
(
    SELECT 
    'Candidate' AS [Entity]   
    ,viwProposals.ProposalId AS EntityID 
    ,viwProposals.LastModifiedOn AS LastModifiedOn 
    FROM 
    viwProposals 
    WHERE 
    [email protected]_OrgId AND IsHide = 0 

    UNION 

    SELECT 
    'Employee' AS [Entity]   
    ,viwEmployees.EmployeeId AS EntityID 
    ,viwEmployees.LastModifiedOn AS LastModifiedOn 
    FROM 
    viwEmployees 
    WHERE 
    [email protected]_OrgId AND IsTerminate = 0 
) 
    SELECT 
     q.*, 
     ROW_NUMBER() OVER (ORDER BY LastModifiedOn DESC) AS RowNo 
    FROM  
     q    
    ORDER BY 
     LastModifiedOn DESC    
END 

我想在q運行光標我怎麼能做到這一點。

+1

*** ***爲什麼地球上的你想使用遊標?這是**最糟糕的**可能的設計在大多數情況下在SQL Server上下文中 - **不要這樣做**除非**絕對**必須...... – 2013-05-07 11:45:32

+2

您遇到什麼錯誤?此外,我們可以看到,IsHide未在此SP定義的任何地方,並且使用在cluase WHERE ORGID = @ ip_OrgId AND IsHide = @IsHide – 2013-05-07 11:48:30

+0

ip_OrgId是傳遞一個參數時調用存儲過程(例如ip_OrgId = 400),並IsHide是一個變量(例如IsHide = 0) - @Sandeep Kumar – 2013-05-07 11:56:03

回答

1

嘗試這一個 -

ALTER PROCEDURE [dbo].[spGetAllCandidatesEmployeesByOrgId] 

    @ip_OrgId INT,    
    @Active_XML BIT 

AS BEGIN 

    DECLARE 
      @Entity VARCHAR(10) 
     , @EntityID BIGINT 
     , @LastModifiedOn DATETIME 
     , @RowNum BIGINT 

    DECLARE cursor_name CURSOR FAST_FORWARD READ_ONLY FOR 
     SELECT 
       q.Entity 
      , q.EntityID 
      , q.LastModifiedOn 
      , RowNo = ROW_NUMBER() OVER (ORDER BY q.LastModifiedOn DESC) 
     FROM (
      SELECT 
        'Candidate' AS [Entity]   
       , v.ProposalId AS EntityID 
       , v.LastModifiedOn AS LastModifiedOn 
      FROM dbo.viwProposals v 
      WHERE [email protected]_OrgId AND IsHide = 0 

      UNION 

      SELECT 
        'Employee'   
       , v.EmployeeId 
       , v.LastModifiedOn 
      FROM dbo.viwEmployees v 
      WHERE [email protected]_OrgId AND IsTerminate = 0 
     ) q    
     ORDER BY LastModifiedOn DESC 

    OPEN cursor_name 

    FETCH NEXT FROM cursor_name INTO 
      @Entity 
     , @EntityID 
     , @LastModifiedOn 
     , @RowNum 

    WHILE @@FETCH_STATUS = 0 BEGIN 

     -- 

     FETCH NEXT FROM cursor_name INTO 
       @Entity 
      , @EntityID 
      , @LastModifiedOn 
      , @RowNum 

    END 

    CLOSE cursor_name; 
    DEALLOCATE cursor_name; 

END 

或者試試這個 -

ALTER PROCEDURE [dbo].[spGetAllCandidatesEmployeesByOrgId] 

    @ip_OrgId INT,    
    @Active_XML BIT 

AS BEGIN 

    DECLARE 
      @Entity VARCHAR(10) 
     , @EntityID BIGINT 
     , @LastModifiedOn DATETIME 
     , @RowNum BIGINT 

    DECLARE cursor_name CURSOR FAST_FORWARD READ_ONLY FOR 
     WITH cte AS 
     (
      SELECT 
        'Candidate' AS [Entity]   
       , v.ProposalId AS EntityID 
       , v.LastModifiedOn AS LastModifiedOn 
      FROM dbo.viwProposals v 
      WHERE [email protected]_OrgId AND IsHide = 0 

      UNION 

      SELECT 
        'Employee'   
       , v.EmployeeId 
       , v.LastModifiedOn 
      FROM dbo.viwEmployees v 
      WHERE [email protected]_OrgId AND IsTerminate = 0 
     ) 
     SELECT 
       q.Entity 
      , q.EntityID 
      , q.LastModifiedOn 
      , RowNo = ROW_NUMBER() OVER (ORDER BY q.LastModifiedOn DESC) 
     FROM cte q    
     ORDER BY LastModifiedOn DESC 

    OPEN cursor_name 

    FETCH NEXT FROM cursor_name INTO 
      @Entity 
     , @EntityID 
     , @LastModifiedOn 
     , @RowNum 

    WHILE @@FETCH_STATUS = 0 BEGIN 

     -- 

     FETCH NEXT FROM cursor_name INTO 
       @Entity 
      , @EntityID 
      , @LastModifiedOn 
      , @RowNum 

    END 

    CLOSE cursor_name; 
    DEALLOCATE cursor_name; 

END 
+0

謝謝您的回答,但我想將「cte q」更新爲光標。有可能的? – 2013-05-07 12:38:36

+0

對不起,但CTE不是一張桌子。所以簡短的答案是否定的。 – Devart 2013-05-07 12:45:24