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 尝试创建索引视图但是我收到以下错误的主要内容,如果未能解决你的问题,请参考以下文章

sql server:索引视图包含每组最大的行

SQL Server 索引视图:无法创建聚集索引,因为选择列表包含聚合函数结果的表达式

在 SQL Server 中的架构绑定视图上创建索引

索引视图中的 SQL Server ISDATE

SQL Server 索引视图

SQL Server - 带有 string_agg 的索引视图