了解SQL Server 2008 R2中索引视图中的列类型

时间:2010-12-09 10:20:03

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

我们通过这样的sql创建了一个索引视图:

Select Table1_ID, Count_BIG(*) as Table2TotalCount from Table2 inner join
Table1 inner join... where...

创建视图后,我们在Table1_ID列上设置了聚簇唯一索引 所以View包含两列:

Table1_ID
Table2TotalCount

我们有两个问题:

  1. 如果我们使用Count(1)Count_BIG(1)代替Count_BIG(*),则SQL不允许我们在Table1_ID上设置索引
  2. 我们如何控制第二列的类型(Table2TotalCount) - SQL给出了一个  长可空类型到此列。但我们希望将 int not nullable 类型设置为此列。创建View后,我们找不到任何更改列类型的方法。 我们用于创建视图的t-sql也总是将int值返回到 Table2TotalCount

2 个答案:

答案 0 :(得分:1)

您必须使用COUNT_BIG(*)。这是creating an indexed view的限制之一:

  

视图中的SELECT语句不能包含以下Transact-SQL语法元素:

     
      
  • COUNT(允许COUNT_BIG(*)。)
  •   

您可以创建第二个未编入索引的视图,该视图引用此第一个视图,并将count列的数据类型转换为您想要的类型(并且可能使用ISNULL()来阻止可为空的属性)

答案 1 :(得分:0)

  1. 这可能是因为你指望的是表达而不是字段或*。使用count(1)会得到与count(*)相同的结果,即计算记录数,因此没有理由使用count(1)

  2. 使用count代替count_big获取int而不是bigint(长)。 (文档明确说明它们之间的唯一区别是返回类型。)我不知道为什么值可以为空,因为count永远不会返回null,但是对于所有聚合可能都是相同的,并且可能不是可以控制。