基本上,我希望在运行时在时态表中创建计算列,为此,我必须遵循以下步骤:

  1. 将SYSTEM_VERENCING设置为OFF
  2. 更改tempral并添加计算列
  3. 将系统版本控制打开

下面是一个例子: 我有一个时态表‘FTWV’和一个历史表‘FTWVHistory’,计算列的内容将从json列‘data’中提取.

  ALTER TABLE [dbo].[FTWV] SET (SYSTEM_VERSIONING = OFF);
  ALTER TABLE [dbo].[FTWV] ADD [Identity] AS JSON_VALUE([Data], '$.Identity'); 
  ALTER TABLE [dbo].[FTWV] SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[FTWVHistory]));

当我执行上述查询时,我收到以下错误消息:

将SYSTEM_VERDING设置为ON失败,因为表‘DatabaseName.dbo.FTWV’有5列,而表‘DatabaseName.dbo.FTWVHistory’有4列.

因此,我猜如果我只将相同的计算列添加到‘FTWVHistry’表中,它就会起作用

ALTER TABLE [dbo].[FTWV] SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE [dbo].[FTWV] ADD [Identity] AS JSON_VALUE([Data], '$.Identity'); 
ALTER TABLE [dbo].[FTWVHISTORY] ADD [Identity] AS JSON_VALUE([Data], '$.Identity'); 
ALTER TABLE [dbo].[FTWV] SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[FTWVHistory]));

但在执行最后一行(将SYSTEM_VERCARATION设置为ON)时,我得到了另一行代码:

将SYSTEM_VERENCING设置为ON失败,因为历史记录表‘DatabaseName.dbo.FTWVHistory’计算了列规范.请考虑删除所有计算列规范,然后重试.

推荐答案

不能将计算列添加到时态表中.相反,您需要关闭系统版本控制,然后将computed列添加到系统版本化表中,然后将数据类型为same的列添加到历史表中.

ALTER TABLE [dbo].[FTWV] SET (SYSTEM_VERSIONING = OFF);
GO
ALTER TABLE [dbo].[FTWV] ADD [Identity] AS JSON_VALUE([Data], '$.Identity'); 
ALTER TABLE [dbo].[FTWVHISTORY] ADD [Identity] nvarchar(4000);
GO
ALTER TABLE [dbo].[FTWV] SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[FTWVHistory]));

作为附注,由于JSON_VALUE返回nvarchar(4000),因此我建议explicitly CAST/CONVERT将您的计算列设置为适当的数据类型,然后使用该数据类型创建列(在历史表中).

Sql相关问答推荐

PostgreSQL:如果发现多行具有相似列值,则跳过 Select 行

postgresql插入json不工作

SQL查询组类值在同一行中,并连接和排序其他值

从以前的非空值行中获取值

更新在两个或多个面中具有交点的面

如何从JSON数组中 Select 多个值

如何从Spark SQL的JSON列中提取动态数量的键值对

数据库SQL PARSE_SYNTAX_ERROR

按两列分组,并根据SQL中的条件返回第三个列值

根据是否出现过零来筛选数据(跨多行)

此过程如何在不引用传递的参数值的情况下执行工作?

使用 SQL 将列添加到 Access 数据库时出错

具有分组条件的不同计数 (DAX)

清理 XML 数据

根据潜在空值的条件对记录进行计数

postgres按组消除分区中的NULLS

在 postgresql 中保存带有时间戳的几何类型数据

SQL日期比较用例;月初至今的报告

Oracle SQL 查询自行运行,但在包装到select count(*) from ()时失败

如何刷新在视图之上创建的表