【问题标题】:SQL Server 2008 incrementSQL Server 2008 增量
【发布时间】:2014-04-29 09:48:31
【问题描述】:

我有一张桌子

Table A (ID,RecNo, Old,New)
Table B (ID,AuditDate,Event)

当我的TableA.ID = TableB.ID 时,我怎样才能使 RecNo 的增量变为1,2,3。我正在做审计触发器。例如,如果我更新系统上的 3 个字段。 TableA.ID 必须与 TableB.ID 相同,并且由于我更新了 3 个字段,假设 ID 为 10,RecNo 将具有 1,2,3 并存储旧值和新值。每次事件发生时,ID 都会自动递增。如果有另一个 ID,则 RecNo 将再次从 1 开始。我试过@recNo = @recNo + 1,但这个数字一直在跳跃。有没有大家都知道的指南??

【问题讨论】:

  • 查询表时使用IDENTITYSELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY GlobalID) as RecNo, ... 分配全局递增值要容易得多。

标签: sql sql-server integer increment


【解决方案1】:

我在这个任务中使用了SQL Server Instead Of Trigger, 这是示例 SQL 脚本,希望对您有所帮助

如果插入语句在一次执行中插入多行,我在 SQL 触发器中使用了一个临时表来获得正确的结果

SQL Row_Number function用于防止在一个语句中为同一个id执行多个条目

您可以使用下面给出的相同 INSERT 语句测试脚本

create table TableA (
        ID int, 
        RecNo int,
        Old int, 
        New int
    )



create Trigger trg_TableAInsert on dbo.TableA Instead Of Insert
 AS
 Begin

    Create Table #temp (id int, MaxRecNo int)
    Insert Into #temp
    Select distinct i.id, MAX(TableA.RecNo) OVER (Partition by i.ID)
    From inserted i
    LEFt JOIN TableA on i.ID = TableA.ID

    Insert Into TableA (ID, RecNo, Old, New)
    Select i.ID, ISNULL(#temp.MaxRecNo,0) + ROW_NUMBER() over (partition by i.id order by i.id), i.Old, i.New
    From inserted i
    inner join #temp on i.ID = #temp.ID

    drop Table #temp

 End



insert into tablea (id, old,new) values (1,1,2)
insert into tablea (id, old,new) values (2,1,2)
insert into tablea (id, old,new) select distinct id,9,10 from TableA
insert into tablea (id, old,new) select top 3 4,0,1 from tablea
select * from tablea

【讨论】:

    猜你喜欢
    • 2017-07-28
    • 1970-01-01
    • 2012-12-09
    • 2012-12-01
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    相关资源
    最近更新 更多