查看结果的SQL Server自动ID

时间:2019-01-03 20:14:52

标签: sql-server

我们正在使用下面的视图通过ROW_NUMBER()函数生成标识列的值,但是如何更改此视图以在标识列中返回增量数字,例如,如果今天运行视图,它将返回100条记录, identity列的值是1到100,如果我明天运行它,它应该返回101到当天的记录。非常感谢您的帮助。

CREATE VIEW [dbo].[Data_Old] 
AS
    SELECT 
        ROW_NUMBER() OVER (ORDER BY event_time) AS id,
        event_time, loc, c, d, e, f, Expr1
    FROM
        (SELECT 
             FORMAT(h.ACTIVITYDT, 'yyyy MMM dd hh:mm:ss') AS event_time, 
             ISNULL(h.LOCATION, N'17.51.12.24') loc, 
             ' LEEF:1.0|Manage|WorkSite|9.5|' + CAST(NEWID() AS varchar(50)) c, 
             '|devTime=' + FORMAT(h.ACTIVITYDT, 'MMM dd hh:mm:ss') d, 
             '|usrName=' + ISNULL(h.USER, N'{null}') + '|fullName=' + ISNULL(u.FULLNAME, N'{null}') e, 
             '|activity=' + ISNULL(h.ACTIVITYDT, N'{null}') + '|library=COLLECTIONS' + '|Num=' + CAST(h.NUM AS varchar) + '|version=' + CAST(h.VERSION AS varchar) f, 
             '|pagesPrinted=' + CAST(h.PAGES_PRINTED AS varchar) + '|FTI=' + ISNULL(CAST(d.CBOOL2 AS varchar), N'False') 
                              + '|keyData=case:' + ISNULL(d.C5ALIAS, N'{null}') + ';serialNo:' + ISNULL(d.C16ALIAS, N'{null}') 
                              + ';documentNo:' + ISNULL(CAST(d.CDBL1 AS varchar), N'') AS Expr1
         FROM 
             dbo.HISTORY AS h 
         LEFT OUTER JOIN 
             dbo.MASTERS AS d WITH (nolock) ON d.NUM = h.NUM AND d.VERSION = h.VERSION 
         LEFT OUTER JOIN 
             dbo.USERS AS u WITH (nolock) ON h.USER = u.USERID
         WHERE 
             (h.ACTIVITYDT >= DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0) 
              AND h.ACTIVITYDT < DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()) + 1, 0)) 
             AND (h.ACTIVITYDT >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) 
                  AND h.ACTIVITYDT < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0)) 
             AND (h.ACTIVITYDT >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) 
                  AND h.ACTIVITYDT < DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) + 1, 0)) 

         UNION ALL

         SELECT  
             FORMAT(ACTIONDT, 'yyyy MMM dd hh:mm:ss') AS event_time, 
             ' 127.55.82.124' b, 
             ' LEEF:1.0|Manage|WorkSite|9.5|' + CONVERT(VARCHAR, SID) + CONVERT(VARCHAR, DATEDIFF(SECOND, ACTIONDT, '2017-01-01')) c,
             '|devTime=' + FORMAT(ACTIONDT, 'MMM dd hh:mm:ss') d,
             '|usrName=' + ISNULL(USERID, '{null}') e,
             '|activity=' + CASE ACTIONSID       
                               WHEN 1 THEN 'Successful Login' 
                               WHEN 2 THEN 'Unsuccessful Login' 
                               WHEN 3 THEN 'Impersonated Login' 
                               WHEN 4 THEN 'Impersonated Logoff' 
                            END f, 
             '|library=COLLECTIONS' AS LEEF
         FROM 
             dbo.HISTORY
         WHERE 
             (ACTIONDT >= DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()), 0) 
              AND ACTIONDT < DATEADD(YEAR, DATEDIFF(YEAR, 0, GETDATE()) + 1, 0)) 
             AND (ACTIONDT >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) 
                  AND ACTIONDT < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) + 1, 0)) 
             AND (ACTIONDT >= DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0) 
                  AND ACTIONDT < DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) + 1, 0)) 
        ) AS MyResult

1 个答案:

答案 0 :(得分:1)

在没有WHERE子句的CTE中在整个表上生成ROW_NUMBER()。

然后仅查看今天的数据,请从CTE中选择并使用WHERE子句。

您当前的代码首先(在派生表中)应用WHERE子句,然后对那些过滤后的结果使用ROW_NUMBER(),因此行号将始终从1开始。