【问题标题】:Problem with creating Indexed View AND Group BY in SQL Server 2008 R2在 SQL Server 2008 R2 中创建索引视图和 Group BY 的问题
【发布时间】:2010-12-10 13:07:51
【问题描述】:

我想用这样的 t-sql 创建索引视图:

    Select
   Table1_ID,
   cast(CONVERT(varchar(8),
   t2.Object_CreationDate, 112)AS DateTime) as Object_CreationDate ,
   Count_BIG(*) as ObjectTotalCount 
   from
       [dbo].Table2 t2 inner join [dbo].Table1 t1 on ...   
   Group BY
       Table1_ID, CONVERT(varchar(8), t2.Object_CreationDate, 112))

我需要group by 仅按Object_CreationDate 列的datepart (类型 datetime2 )。

我还想在派生视图中为列 Theme_IdObject_CreationDate 设置索引。
如果我在 SELECT 中使用 cast(CONVERT(varchar(8), m.Mention_CreationDate, 112)AS DateTime) - 我会遇到此列的索引问题。因为此列 (Object_CreationDate) 不是确定性的。

不知道有没有可能解决问题。

【问题讨论】:

    标签: sql-server view windows-server-2008-r2 indexed


    【解决方案1】:

    替换...

    CONVERT(varchar(8), t2.Object_CreationDate, 112))
    

    ...与

    DATEADD(day, DATEDIFF(day, 0, t2.Object_CreationDate), 0)
    --OR
    CAST(t2.Object_CreationDate AS date)
    

    第 2 种格式仅适用于 SQL Server 2008+,第 1 种更通用

    这会从日期/日期时间数据类型域中的日期时间值中删除时间组件,而无需任何中间区域设置相关的日期时间格式

    查看这些答案:OneTwo(comments)

    【讨论】:

    • 谢谢,有帮助。但是当我尝试使用命令在 [View](Theme_ID,Object_CreationDate) 上创建唯一索引 IX_Theme_ID_Object_CreationDate 设置索引时 - sql 给出一个错误,因为我在这个视图上没有唯一的聚集索引,所以我不能添加这个索引。
    • 您需要完全按照错误消息中的说明识别“唯一聚集索引”。也许是“Table1_ID”。如果索引视图没有唯一键,SQL Server 将如何知道哪一行是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多