你能在SQL Server中拥有一个部分Identity列吗?

时间:2009-09-27 10:42:10

标签: sql sql-server sql-server-2005 tsql

我有一个带有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中进行定义?

2 个答案:

答案 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进行操作。