当我尝试将字段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
答案 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())