我们通过这样的sql创建了一个索引视图:
Select Table1_ID, Count_BIG(*) as Table2TotalCount from Table2 inner join
Table1 inner join... where...
创建视图后,我们在Table1_ID列上设置了聚簇唯一索引 所以View包含两列:
Table1_ID
Table2TotalCount
我们有两个问题:
Count(1)
或Count_BIG(1)
代替Count_BIG(*)
,则SQL不允许我们在Table1_ID上设置索引Table2TotalCount
) - SQL给出了一个
长可空类型到此列。但我们希望将 int not nullable 类型设置为此列。创建View后,我们找不到任何更改列类型的方法。
我们用于创建视图的t-sql也总是将int值返回到 Table2TotalCount 。答案 0 :(得分:1)
您必须使用COUNT_BIG(*)。这是creating an indexed view的限制之一:
视图中的SELECT语句不能包含以下Transact-SQL语法元素:
- COUNT(允许COUNT_BIG(*)。)
您可以创建第二个未编入索引的视图,该视图引用此第一个视图,并将count列的数据类型转换为您想要的类型(并且可能使用ISNULL()来阻止可为空的属性)
答案 1 :(得分:0)
这可能是因为你指望的是表达而不是字段或*
。使用count(1)
会得到与count(*)
相同的结果,即计算记录数,因此没有理由使用count(1)
。
使用count
代替count_big
获取int
而不是bigint
(长)。 (文档明确说明它们之间的唯一区别是返回类型。)我不知道为什么值可以为空,因为count
永远不会返回null,但是对于所有聚合可能都是相同的,并且可能不是可以控制。