SQL Server 2014 尝试创建索引视图但是我收到以下错误
Posted
技术标签:
【中文标题】SQL Server 2014 尝试创建索引视图但是我收到以下错误【英文标题】:SQL Server 2014 trying to create an indexed view however I'm getting the following error 【发布时间】:2016-10-13 21:10:36 【问题描述】:SELECT
fcb.PharmacyKey as PharmID
,fcb.DateKeY as UploadDate
,fcb.RecordSource as Description
,fcb.Amount
FROM
dbo.FactCheckBookData fcb
WHERE
fcb.RecordSource in ('BeginningBalance')
AND convert(datetime, left(fcb.DateKey, 8),101) = DATEADD(MONTH, DATEDIFF(MONTH, 0, Convert(varchar(8), getdate(), 112)), 0)
错误:
无法在视图“dbo.view”上创建索引,因为该视图使用 从字符串到 datetime 或 smalldatetime 的隐式转换。使用 具有确定性样式值的显式 CONVERT。
【问题讨论】:
Convert(varchar(8),getdate(),112)
,为什么?你应该使用GETDATE()
我需要将视图过滤到当月的第一天,因此 getdate() 不起作用。
@Lamak 说没有必要在 DATEDIFF
函数中转换日期(例如,只写 DATEDIFF(MONTH, 0, GETDATE())
),但我怀疑这是导致您的问题的原因。
【参考方案1】:
您可以在上个月末增加一天。
SELECT
fcb.PharmacyKey as PharmID
,fcb.DateKeY as UploadDate
,fcb.RecordSource as Description
,fcb.Amount
FROM dbo.FactCheckBookData fcb
WHERE fcb.RecordSource in ('BeginningBalance')
AND convert(datetime,left(fcb.DateKey,8),101) =
DateAdd (Day, 1, EOMONTH(getdate(), -1))
【讨论】:
【参考方案2】:如 cmets 中所述,要查找该月的第一天,您可以使用
DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()),0)
但是,如果您更改代码,错误将更改为
Cannot create index on view 'someView'. The function 'getdate' yields nondeterministic results. Use a deterministic system function, or modify the user-defined function to return deterministic results.
因为GETDATE()
是不确定的,因此不能在索引视图中使用。
https://msdn.microsoft.com/en-AU/library/ms191432.aspx
https://msdn.microsoft.com/en-us/library/ms178091.aspx
【讨论】:
以上是关于SQL Server 2014 尝试创建索引视图但是我收到以下错误的主要内容,如果未能解决你的问题,请参考以下文章