我想为其自定义ID列创建一个带有计算列的表。我想要的格式是BID(The Year)-0000
,例如:{/ p>
BID2017-0001
我尝试了下面的t-sql代码,但是我得到了非确定性错误。我该如何解决这个问题?
CREATE TABLE Books
(ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
BookID AS 'BID'+CAST(YEAR(GETDATE()) as VARCHAR(4))+ RIGHT ('0000' + CAST(ID AS VARCHAR(4)), 4) PERSISTED UNIQUE,
ISBN VARCHAR(32),
BookName NVARCHAR(50),
AuthorName NVARCHAR(50),
BLanguage VARCHAR(50),
StaId int,
StuId int,
CatNo int);
我也试过这篇文章,但无法解决问题。 non-deterministic
更新
此外,我需要在新年开始时将'0000'
系列重置为'0000'
。例如,2017年的最后一个ID是' BID2017-0932'当年份更改为2018年时,我希望ID中的零序列重置为'0000'
,例如'BID2018-0001'
我该如何实现?
答案 0 :(得分:1)
你的代码中有getdate()
,这使得列不确定。删除它会有所帮助..
如果你想知道为什么getdate()是非确定性的。检查这里:Is GetDate() deterministic ..
摘录摘录
deterministic意味着函数在给定相同输入的情况下返回相同的值。在这种情况下,您没有输入,但您始终获得不同的值!系统时钟不是输入,它是函数所依赖的外部状态。
答案 1 :(得分:1)
最简单的解决方案
我会添加一个CreateDate
列:
ALTER TABLE dbo.Books
ADD CreateDate DATETIME NOT NULL
CONSTRAINT DF_Books_CreateDate
DEFAULT(GETDATE())
GO
然后我会添加计算列:
ALTER TABLE dbo.Books
ADD BookID AS ('BID' + LTRIM(YEAR(CreateDate)) + '-' + RIGHT('0000' + LTRIM(ID), 4)) /*PERSISTED*/
GO