假设我有一个包含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
)
答案 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
字符串。或者你可以让函数返回一个字符串并在那里完成所有的字符串构建。