我在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
)
我的问题是为什么计算列中的括号会消失?我是否需要在某个地方选择一个选项来保存它们,或者我错过了什么?
答案 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 - 否则,当费率更改时,您的所有历史计算也会发生变化,这是您不想要的。