Azure SQL Server 2016时态表

时间:2016-11-04 01:04:55

标签: sql azure sql-server-2016

我正在考虑在我们的数据库中创建时态表https://msdn.microsoft.com/en-us/library/mt604462.aspx,但我不能在几个有计算列的表上。

返回的错误消息非常自我解释

  

“计算列是使用用户定义的函数定义的,系统版本表不允许这样做”

但是我希望有一种方法可以排除或忽略被跟踪的列吗?

我尝试删除计算列创建历史表,然后将计算列添加回表中,但这不起作用。

感谢任何帮助。

由于

编辑 -
我无法找到一种方法来忽略被跟踪的列,但我们能够重构出使用UDF的列,从而使我们能够使用时态表。

2 个答案:

答案 0 :(得分:4)

我正在努力将计算列添加到现有的系统版本表中。如果遇到类似问题的其他人,我终于意识到历史表不会以同样的方式处理列。它最终类似于在基表上有一个IDENTITY列,但这会导致历史表上的常规INT字段。

如果您尝试将计算列添加到系统版本(时间)表:

  • 首先关闭系统版本控制
  • 然后将计算列添加到基表
  • 验证生成的计算列的“类型”
  • 将具有相应静态类型的列添加到历史记录表
  • 重新启用系统版本控制(不要忘记指定历史记录表)

我发现在重新启用系统版本控制时,您可能会意外省略history_table,这很奇怪。我希望它可以恢复版本化到同一个表或者抛出某种错误,因为它可能会有一些意想不到的行为。

@ pasquale-ceglie - 我没有足够的声誉发表评论,但我想扩大您所说的内容。您应该能够将大多数计算列与时态表一起使用,只需更多手动。基本上,您不能使用计算列复制模式定义,但是您可以复制结果列并生成相应的历史表,然后再尝试打开所有内容。这两个表的定义略有不同(起初我很困惑)。我在这里订阅,如果以上内容不清楚并且很好奇,请告诉我。

答案 1 :(得分:0)

系统版本的表架构修改失败,因为不支持在系统版本控制为ON时添加计算列,因此出于同样的原因,如果在其上有计算列,则无法将常规表转换为临时表

希望会有所帮助,