表中的计算列“月”无法保留,因为该列是非确定性的

时间:2011-09-06 06:02:26

标签: sql sql-server

当我尝试将字段IsPersisted = True

时,我收到一个错误

这是我的表的定义

CREATE TABLE [dbo].[AdvanceMST](
[AdvanceID] [bigint] IDENTITY(1,1) NOT NULL,
[AppliedDate] [datetime] NULL,
[ApprovedDate] [datetime] NULL,
[AdvanceStatus] [varchar](100) NULL,
[AdvanceFromEngineerID] [bigint] NULL,
[AdvanceToEngineerID] [bigint] NULL,
[AccountResourceID] [bigint] NULL,
[AdvanceAmount] [float] NULL,
[ApprovedAdvanceAmount] [float] NULL,
[POrderID] [bigint] NULL,
[SiteID] [bigint] NULL,
 CONSTRAINT [PK_AdvanceMST] PRIMARY KEY CLUSTERED 
(
[AdvanceID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,     ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

这是错误消息 表'Tmp_AdvanceMST'中的计算列'Month'无法保留,因为该列是非确定性的。

我无法理解此错误消息的含义以及如何解决此问题以使其成为IsPersisted = true

1 个答案:

答案 0 :(得分:9)

datename函数可以返回不同的结果,具体取决于登录用户的语言,因此不具有确定性。将计算列标记为持久意味着SQL Server存储计算结果,该结果要求只有一个结果。

如果您需要将其保留为持久性,则可以使用您想要使用的特定语言的12分支case表达式替换。

虽然将month(AppliedDate)作为持久化整数列并且在非持久计算列中具有datename函数可能会更好。

根据评论编辑给出示例

CREATE TABLE #T
  (
     [AppliedDate] DATETIME,
     [Month] AS CASE MONTH([AppliedDate])
          WHEN 1 THEN 'January'
          WHEN 2 THEN 'February'
          WHEN 3 THEN 'March'
          WHEN 4 THEN 'April'
          WHEN 5 THEN 'May'
          WHEN 6 THEN 'June'
          WHEN 7 THEN 'July'
          WHEN 8 THEN 'August'
          WHEN 9 THEN 'September'
          WHEN 10 THEN 'October'
          WHEN 11 THEN 'November'
          WHEN 12 THEN 'December'
        END PERSISTED
  )  

  INSERT INTO #T([AppliedDate]) VALUES (GETDATE())