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 - 否则,当税率发生变化时,您所有的历史计算也会发生变化,这是您不希望的。
我在 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 - 否则,当税率发生变化时,您所有的历史计算也会发生变化,这是您不希望的。