SQL Server 2012中的特殊自定义增量列

时间:2018-02-09 19:50:06

标签: sql sql-server tsql

假设我有一个包含3列的表TableTask

TaskID, DesignID, TaskName

我希望TaskName有一个特殊列,其自动编号取决于DesignID,我希望重复.XXX部分,但每条记录仍然是唯一的,因为有IDX部分

ID1.001, ID1.002, ..., ID1.999
ID2.001, ID2.002

我尝试过类似下面代码中的内容,但我只能得到

ID1.001, ID1.002, ID1.003, ID2.004, ID2.005

我的代码:

CREATE TABLE TableTask
(
    TaskID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
    DesignID INT NOT NULL,
    TaskName AS 'ID' + CAST(DesignID AS VARCHAR(6)) + '.' +
                       RIGHT('000' + CAST(TaskID AS VARCHAR(3)), 3) PERSISTED
)

2 个答案:

答案 0 :(得分:1)

您可以在查询时使用row_number执行此操作(示例包含变量以便于测试):

declare @TableTask TABLE 
(
    TaskID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
    DesignID INT NOT NULL
)

insert into @TableTask values(1), (2), (1), (1), (2), (3), (4)

select *, 
    'ID' + CAST(DesignID AS VARCHAR(6)) + '.' + RIGHT('000' + convert(varchar(3), row_number() over (partition by DesignID order by TaskID)), 3) AS TasName
from @TableTask

输出:

1   1   ID1.001
3   1   ID1.002
4   1   ID1.003
2   2   ID2.001
5   2   ID2.002
6   3   ID3.001
7   4   ID4.001

答案 1 :(得分:-1)

你可以使它成为一个Computed Column,它调用一个函数,该函数返回该行的设计ID的下一个最高.XXX部分,并将它们连接起来。

DesignID + '.' + MySchema.MyFunction(DesignID)

函数中的代码,在简单的伪代码中,看起来像这样:

DECLARE @Output int;

SELECT @Output=CONVERT(int,RIGHT(MAX(TaskName),3))
FROM MyTable
WHERE DesignID=@parameter;

IF @Output IS NULL
  SET @Output=0;

RETURN @Output + 1;

这假定函数返回一个整数,并在计算中构建TaskName字符串。或者你可以让函数返回一个字符串并在那里完成所有的字符串构建。