Sql 向存储过程添加行号

Sql 向存储过程添加行号,sql,tsql,Sql,Tsql,我试图将行号添加到一个存储过程中,该存储过程是多年前由一位退休人员编写的。这两个工会似乎是我遇到麻烦的地方。任何建议都会有帮助,因为我在这里似乎走到了死胡同 CREATE procedure [dbo].[sp_GetReleases] @Area VARCHAR(10) = NULL as SET @Area = LOWER(@Area) SELECT r.releaseid, r.release_id, r.releasedatetext, r.topic,

我试图将行号添加到一个存储过程中,该存储过程是多年前由一位退休人员编写的。这两个工会似乎是我遇到麻烦的地方。任何建议都会有帮助,因为我在这里似乎走到了死胡同

CREATE procedure [dbo].[sp_GetReleases]
  @Area VARCHAR(10) = NULL
as

SET @Area = LOWER(@Area)

SELECT
       r.releaseid, r.release_id, r.releasedatetext, r.topic,
       r.releasedate as 'sortdate', '1' as 'sortcode', r.YouTubeID,
       rv.Videoflv, rv.Videomp4      
FROM release r, area a, ReleaseVideos rv
WHERE r.areaid = a.areaid
AND   r.releaseid  = rv.releaseid
AND a.area_id = @area
AND r.webdisplay = 1
AND GETDATE() >= availabledate

UNION

-- This is new 02-19-15
SELECT 
       r.releaseid, r.release_id, r.releasedatetext, r.topic,
       r.releasedate as 'sortdate', '1' as 'sortcode', r.YouTubeID,
       rv.Videoflv, rv.Videomp4      
FROM release r, area a, ReleaseVideos rv, ReleaseStates rs
WHERE   r.releaseid  = rv.releaseid
AND   a.area_id = @area

AND   a.areaid = rs.areaid
AND   r.releaseid = rs.releaseid

AND r.webdisplay = 1
AND GETDATE() >= availabledate

UNION

SELECT 
        r.releaseid, r.release_id, r.releasedatetext, r.topic, 
       (select r2.releasedate
        FROM release r2,  relatedrelease rr2
        WHERE r2.release_id = rr2.release_id) sortdate,
        '2' as 'sortcode',  r.YouTubeID,
        rv.Videoflv, rv.Videomp4
        
FROM release r, relatedrelease rr, ReleaseVideos rv
WHERE r.release_id = rr.related_id
AND   r.releaseid  = rv.releaseid
AND r.webdisplay = 1
AND GETDATE() >= r.availabledate
AND rr.release_id in 
    (SELECT release_id
     FROM release, area a
     WHERE a.area_id = @area
     AND release.areaid = a.areaid)
ORDER BY sortdate DESC, sortcode 
GO

用另一个select封装整个sql,并为外部查询应用
row\u number()

select x.*, row_number() over (order by release_id) rn
from (

    SELECT
           r.releaseid, r.release_id, r.releasedatetext, r.topic,
           r.releasedate as 'sortdate', '1' as 'sortcode', r.YouTubeID,
           rv.Videoflv, rv.Videomp4      
    FROM release r, area a, ReleaseVideos rv
    WHERE r.areaid = a.areaid
    AND   r.releaseid  = rv.releaseid
    AND a.area_id = @area
    AND r.webdisplay = 1
    AND GETDATE() >= availabledate
    
    UNION
    
    -- This is new 02-19-15
    SELECT 
           r.releaseid, r.release_id, r.releasedatetext, r.topic,
           r.releasedate as 'sortdate', '1' as 'sortcode', r.YouTubeID,
           rv.Videoflv, rv.Videomp4      
    FROM release r, area a, ReleaseVideos rv, ReleaseStates rs
    WHERE   r.releaseid  = rv.releaseid
    AND   a.area_id = @area
    
    AND   a.areaid = rs.areaid
    AND   r.releaseid = rs.releaseid
    
    AND r.webdisplay = 1
    AND GETDATE() >= availabledate
    
    UNION
    
    SELECT 
            r.releaseid, r.release_id, r.releasedatetext, r.topic, 
           (select r2.releasedate
            FROM release r2,  relatedrelease rr2
            WHERE r2.release_id = rr2.release_id) sortdate,
            '2' as 'sortcode',  r.YouTubeID,
            rv.Videoflv, rv.Videomp4
            
    FROM release r, relatedrelease rr, ReleaseVideos rv
    WHERE r.release_id = rr.related_id
    AND   r.releaseid  = rv.releaseid
    AND r.webdisplay = 1
    AND GETDATE() >= r.availabledate
    AND rr.release_id in 
        (SELECT release_id
         FROM release, area a
         WHERE a.area_id = @area
         AND release.areaid = a.areaid)
    ORDER BY sortdate DESC, sortcode 

) x
  • 将整个查询按原样包装(不包括ORDERBY子句)到(命名为
    a
  • 编写一个查询,从
    a
    中选择所有列,并根据
    a
    中的信息选择其他列
  • 大纲:

    WITH a AS (
        -- the original query, minus the order by clause
    )
    SELECT
        *,
        rn=ROW_NUMBER() OVER (/*your number partitioning/ordering here*/)
    FROM
        a
    -- original order by clause here
    

    您可以将from子句中的表达式调用为“派生表”。