如何使计算列成为持久化列?

时间:2016-07-27 01:41:00

标签: sql-server

我正在使用SQL Server 2008 R2。我想在注册新客户时创建自动生成的客户ID。客户ID应采用以下格式

 Customer ID = 
   current year (4 digit) + 
   current month (2 digit) +
   unique number (4 digit).

示例:2012055001

我写了一个查询如下:

create table tb
(
     id int identity(1000, 1),
     cust_id as CONVERT(VARCHAR(4), DATEPART(YYYY, GETDATE())) + 
                SUBSTRING(CONVERT(nvarchar(6), GETDATE(), 112), 5, 2) + 
                CONVERT(VARCHAR(4), id) persisted primary key
);

但我收到以下错误:

  

表'tb'中的计算列'cust_id'无法保留,因为该列是非确定性的。

如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

您将结构数据混淆。您正在尝试使用数据作为结构类型来创建表格,这显然无法正常工作。

列名称为cust_id,但列类型必须是有效的SQL Server数据类型之一(在这种情况下很可能是CHAR(10),因为它是固定的宽度,那里没有Unicode字符可能)。

CREATE TABLE tb(id int identity(1000, 1), cust_id Char(10));

然后,您自动生成的数据会被插入到列中,最有可能是ON INSERT触发器。 (如何创建该触发器是一个完全不同的主题;您可以在大多数SQL教程或书籍或SQL Server文档中找到信息。)