我有一个带有Identity列的表,它提供了我的ticketNumber。
我想要另一个表来提供ticketStepNumber。票证可能有0个或更多步骤,因此我不会总是创建ticketStepNumber。
ticketStepNumber值是ticketNumber列(int)和stepNumber列(int)的组合。我想将stepNumber列定义为一个标识,但是对于ticketNumber列的每个值从1开始,所以我在存储过程中所要做的就是传入ticketNumber,然后我将获得新的stepNumber。 E.g。
ticketNumber stepNumber
1 1
2 1
2 2
2 3
4 1
7 1
7 2
有没有办法在表定义中定义它,还是必须在SP中进行定义?
答案 0 :(得分:1)
不,在SQL Server中没有这样的东西,抱歉。 IDENTITY列是一个不断增加的单一列 - 在另一列的值上没有该数字。
如果你真的必须为每一步都有序号,那么你必须自己处理这些作业(并确保它真正独一无二)。
更新:如果您的表中有一些其他列可以作为排序表达式,您可以使用ROW_NUMBER
函数来实现您想要的效果;例如如果您有TicketDate
(DATETIME)列,则可以执行以下操作:
SELECT
TicketNUmber,
ROW_NUMBER() OVER (PARTITION BY TicketNumber ORDER BY TicketDate) AS StepNumber
FROM YourTable
这将通过TicketNumber“分区”您的数据(例如,对于分区中的每个值,从1开始计数),然后根据ROW_NUMBER
使用TicketDate
按顺序对行进行编号订购。
马克
答案 1 :(得分:1)
这是添加到SP的简单步骤:
SELECT (MAX(stepNumber) + 1) AS @StepNumber FROM [TableName] WHERE ticketNumber = @ticketNumber
当然,您需要添加所有其他声明,以及某种类型的并发检查,如果多个人可以同时对同一个ticketNumber进行操作。