计算列括号在SSDT项目中丢失

时间:2016-02-02 08:10:40

标签: sql-server sql-server-data-tools

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

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 Server时,我得到以下内容:

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
)

我的问题是为什么计算列中的括号会消失?我是否需要在某个地方选择一个选项来保存它们,或者我错过了什么?

2 个答案:

答案 0 :(得分:3)

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

由于*的优先级高于+,因此Cost + (Cost * 0.2)[Cost]+[Cost]*(0.2)具有完全相同的含义。当优先权已处理事项时,服务器不会生成额外的括号。

答案 1 :(得分:1)

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

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

此外,虽然这是偏离主题的,但只要增值税率发生变化(上述代码),上述代码就会成为问题。将增值税百分比存储为表格中的十进制列,而不是将值硬编码为0.2 - 否则,当费率更改时,您的所有历史计算也会发生变化,这是您不想要的。