2011-09-06 63 views
2

我得到一个错误,当我试图让我的领域IsPersisted =真计算列“月”不能持久,因为该列是不确定性

这是我的表的定义

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 =真

+2

该错误消息是用于Tmp_AdvanceMST。代码是AdvanceMST。 –

+1

请给出您试图添加的“月份”列的定义! –

+0

这是我的月份列的定义..(datename(month,[AppliedDate])) –

回答

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()) 
+0

请详细说明您的意思是“datename函数可以根据登录用户的语言返回不同的结果,因此不是确定性的。 “ –

+0

'SET LANGUAGE Italian; SELECT DATENAME(month,getdate()); SET LANGUAGE us_english; SELECT DATENAME(month,getdate())' –

+0

..但我的语言将只有美国英语..我可以修改它? –