【问题标题】:SQL Server 2014 trying to create an indexed view however I'm getting the following errorSQL Server 2014 尝试创建索引视图但是我收到以下错误
【发布时间】: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())),但我怀疑这是导致您的问题的原因。

标签: sql sql-server indexing views


【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      • 2019-05-26
      相关资源
      最近更新 更多