SSDT 项目中丢失的计算柱括号

Computed Column brackets lost in SSDT project

我在 Visual Studio 2015 年有一个 SSDT 项目,它有一个 table 定义如下,其中包括一个计算列。

CREATE TABLE [dbo].[Test] (
    [Id]    INT   NOT NULL,
    [Cost]  MONEY NULL,
    [Vat]   AS    (Cost * 0.2),
    [Total] AS    (Cost + (Cost * 0.2)),
    PRIMARY KEY CLUSTERED ([Id] ASC)
);

当我部署到 SQL 服务器时,我得到以下信息:

CREATE TABLE [dbo].[Test](
    [Id] [int] NOT NULL,
    [Cost] [money] NULL,
    [Vat]  AS ([Cost]*(0.2)),
    [Total]  AS ([Cost]+[Cost]*(0.2)),
PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)

我的问题是为什么计算列中的括号消失了?我需要 select 某处的选项来保存它们还是我遗漏了什么?

计算列未存储为文本。它们以内部高效的形式存储。这意味着,不保留对计算列的实际含义不重要的定义中的任何元素。

由于*的优先级高于+,因此Cost + (Cost * 0.2)[Cost]+[Cost]*(0.2)的含义完全相同。当优先级已经解决问题时,服务器不会生成额外的括号。

你完全可以避免这个问题:

[Cost]  MONEY NULL,
[Vat]   AS    (Cost * 0.2),
[Total] AS    (Cost + Vat),

此外,虽然这是题外话,但一旦增值税税率发生变化(它会发生变化),上述代码就会成为一个问题。将增值税百分比存储为 table 中的小数列,而不是将值硬编码为 0.2 - 否则,当税率发生变化时,您所有的历史计算也会发生变化,这是您不希望的。