Tsql 删除行的存储过程-SQL Server 2008 R2

Tsql 删除行的存储过程-SQL Server 2008 R2,tsql,stored-procedures,sql-server-2008-r2,Tsql,Stored Procedures,Sql Server 2008 R2,我编写了一个存储过程,它只允许有100行具有相同的CustomerPK,因此如果我们要插入第101行,则需要删除具有相同CustomerPK的最早的行 我确信有几种方法可以做到这一点,但我不确定哪种方法最好。这是程序的代码 DECLARE @TokenCount INT; SELECT @TokenCount = COUNT(*) FROM CustomerAuthTokens WHERE CustomerPK = @CustomerPK; IF @T

我编写了一个存储过程,它只允许有100行具有相同的CustomerPK,因此如果我们要插入第101行,则需要删除具有相同CustomerPK的最早的行

我确信有几种方法可以做到这一点,但我不确定哪种方法最好。这是程序的代码

DECLARE 
    @TokenCount INT;

SELECT 
    @TokenCount = COUNT(*)
FROM 
    CustomerAuthTokens
WHERE 
    CustomerPK = @CustomerPK;

IF @TokenCount > 99 
BEGIN
   DELETE FROM CustomerAuthTokens 
   WHERE AuthToken IN (SELECT TOP(@TokenCount - 99) AuthToken 
                       FROM CustomerAuthTokens 
                       WHERE CustomerPK = @CustomerPK
                       ORDER BY TokenCreateTime ASC);
END

为什么不更新最旧的行,而不是插入/delete@EricZ因为在某些极端情况下,最旧的行可能不是第100行
--Insert your row first


-- This will delete customer rows if there are more than 100 rows for that customer
;WITH cte as
(
SELECT row_number() over (partition by CustomerPK order by TokenCreateTime desc) rn 
FROM CustomerAuthTokens
WHERE CustomerPK = @CustomerPK
)
DELETE CTE
WHERE rn > 100