计算栏' BookID'在表格'书籍'无法持久化,因为该列是非确定性的

时间:2017-08-01 09:23:53

标签: sql sql-server

我想为其自定义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'我该如何实现?

2 个答案:

答案 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