我在SQL Server 2005中有一个表,其中包含许多项目的一些更改日志数据。它们存储在一个表中,因为有数百个项目,可以查询项目日志表,例如每天或每人的活动。
例如
projectlogidentity int identity
projectname nvarchar(100)
projectchanged datetime
projectchangedby nvarchar(100)
projectserial int
projectname和projectserial上有索引
我希望在添加行时为每个项目生成一个顺序项目序列
例如:
0 |咖啡店| 2011年1月7日08:13 |德里克| 0
1 |迪斯科| 2011年1月7日08:18 |艾玛| 0
2 |咖啡店| 2011年1月7日08:19 |彼得| 1
3 |迪斯科| 2011年1月7日09:11 |艾伦| 1
4 |咖啡店| 2011年1月7日09:42 | tess | 2
因此,当通过projectname检索单个项目的行时,对于该项目名的每一行都有一个持久的顺序序列号。
插入我目前所做的行后:
update projectlog set projectserial=1+
(select isnull(max(projectserial),0) from projectlog
where projectname='coffee shop') where (projectlogidentity=4);
但是当这个表包含数十万行和数百个项目时,我担心性能。还有更好的方法吗?
感谢
德里克
答案 0 :(得分:1)
我认为你可以使用两张表来表现。
projectlog
----------
projectlogidentity int identity
projectnameid int
projectchanged datetime
projectchangedby nvarchar(100)
projectserial int
projectlog_projectname
----------------------
id int
name nvarchar(100)
serial int
UPDATE projectlog SET projectserial = 1 + (SELECT ISNULL(serial, 0) FROM projectlog_projectname WHERE projectname='coffee shop')
WHERE projectlogidentity = 4;
UPDATE projectlog_projectname SET serial += 1 WHERE projectname='coffee shop'
答案 1 :(得分:0)
使用触发器,它是eaxclty为
创建的内容IF EXISTS (SELECT name FROM sysobjects
WHERE name = 'Incrementprojectserial' AND type = 'TR')
DROP TRIGGER IncrementProjectserial
GO
CREATE TRIGGER IncrementProjectserial
ON projectlog
FOR INSERT
AS
DECLARE @projectname varchar(10) --whatever you datatype is
DECLARE @projectlogidentity int
DECLARE @Maxprojectserial int
-- GET YOUR INSERTED VALUES
SELECT @projectname = projectname FROM INSERTED
SELECT @projectlogidentity = projectlogidentity FROM INSERTED
--GET YOUR PREVIOUS projectserial
SELECT @projectserial = isnull(max(projectserial),0)
FROM projectlog
WHERE projectname=@projectname)
--UPDATE YOUR NEW VALUE
UPDATE projectlog SET projectserial = @Maxprojectserial + 1
WHERE projectlogidentity = @projectlogidentity
GO
这是一个完整的msdn文档