SQL Server - 按列创建新ID“

时间:2012-03-23 08:56:21

标签: sql-server

我有2张桌子

顺序

OrderID INT
...

的OrderItems

OrderIemID INT
OrderID INT
ItemNO INT

我想要的是ItemNO每个OrderID从1开始,OrderIemID中的每个新OrderItems增加1。

我将此添加到插入触发器中。但是有可能以不同的方式做到这一点吗? UDF和计算列,并使用持久性?


UDF:

ALTER FUNCTION [dbo].[afnc_Proc_CreateNewOrderItemsItemNo] (
 @OrderID INT
) RETURNS INT
AS
BEGIN

    DECLARE @NewItemNo INT 

    SET @NewItemNo=1

    SELECT TOP 1 @NewItemNo = ItemNo + 1
        FROM dbo.atbl_Proc_OrderItems
        WHERE OrderID=@OrderID
         ORDER BY ItemNo DESC

    RETURN @NewItemNo
END

触发:

 UPDATE U   
    SET ItemNO=dbo.afnc_Proc_CreateNewOrderItemsItemNo(I.OrderID)
    FROM atbl_Proc_OrderItems AS U
    INNER JOIN inserted I ON U.PrimKey=I.PrimKey   

1 个答案:

答案 0 :(得分:1)

;WITH x AS (SELECT OrderID, OrderItemID, ItemNo,
  rn = ROW_NUMBER() OVER (PARTITION BY OrderID ORDER BY OrderItemID)
  FROM dbo.OrderItems
)
UPDATE x SET ItemNo = rn;

但是正如我在评论中提到的,这个操作非常浪费,因为你可以在查询时简单地使用这个ROW_NUMBER()操作,并保证它是准确的。