SQL Server 2012中根据索引视图存在性执行不同SELECT语句
针对SQL Server 2012的索引视图条件查询实现
你的思路完全没问题,我帮你把代码优化得更简洁精准一些,同时避免冗余的变量定义:
-- 判断目标索引视图是否存在(同时确保对象是视图,避免误判同名表) IF EXISTS ( SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'test') AND OBJECTPROPERTY(object_id, N'IsView') = 1 ) BEGIN -- 索引视图存在时,使用NOEXPAND提示强制使用索引视图 SELECT category, _TimeStamp FROM test WITH (NOEXPAND) WHERE _TimeStamp >= '2018-01-24 00:00:00' AND _TimeStamp < '2018-01-25 00:00:00'; -- 记得补全你的实际结束时间 END ELSE BEGIN -- 索引视图不存在时,直接查询原对象(表或普通视图) SELECT category, _TimeStamp FROM test WHERE _TimeStamp >= '2018-01-24 00:00:00' AND _TimeStamp < '2018-01-25 00:00:00'; END
几点说明:
- 去掉了原来的
@x变量,直接用IF EXISTS分支处理,代码更简洁易读,减少不必要的变量开销 - 新增了
OBJECTPROPERTY(object_id, N'IsView') = 1的判断,防止把同名的表误判成索引视图,让条件判断更精准 - 注意在SQL Server 2012中,
WITH(NOEXPAND)提示仅在企业版、开发版和评估版中生效,不过你的逻辑已经考虑了视图不存在的情况,所以在其他版本中也能正常 fallback 到普通查询 - 建议用
< 结束日期的方式代替<= 结束时间,比如示例中的< '2018-01-25 00:00:00',这样可以避免漏掉当天最后一秒的数据,同时让查询更高效(如果_TimeStamp是 datetime 类型的话)
内容的提问来源于stack exchange,提问作者Dixie
相关产品推荐
相关产品推荐

