SQL 服务器 If Else 索引视图

SQL Server If Else Indexed View

在 SQL Server 2012 中,我想 运行 一个检查索引视图是否存在的查询。如果是,我想 运行 一个 SELECT 语句 WITH(NOEXPAND)。如果没有,我想 运行 一个 select 语句而不展开。下面是我使用的代码:

DECLARE @x int

IF NOT EXISTS (SELECT * FROM sys.indexes
               WHERE object_id = OBJECT_ID('test'))
    SET @x = 0
ELSE
    SET @x = 1

IF(@x = 1)
    SELECT category, _TimeStamp 
    FROM test WITH (NOEXPAND) 
    WHERE _TimeStamp >= '2018-01-24 00:00:00' 
      AND _TimeStamp < DATEADD(hh, +24, '2018-01-24 00:00:00') 
    ORDER BY _TimeStamp ASC

ELSE 
    SELECT category, _TimeStamp 
    FROM test
    WHERE _TimeStamp >= '2018-01-24 00:00:00' 
      AND _TimeStamp < DATEADD(hh, +24, '2018-01-24 00:00:00') 
    ORDER BY _TimeStamp ASC

截至 运行 执行此查询时,数据库中没有此 table 的索引视图,我收到以下错误:

Msg 8171, Level 16, State 2, Line 13
Hint 'noexpand' on object 'test' is invalid.

我有另一个 table,它有一个索引视图,如果我 运行 在那个 table 上进行相同的查询(有一些修改,例如 table 名称) ,运行就好了。我想知道为什么 SQL 服务器在索引视图不存在时抱怨 NOEXPAND,而不是 运行 在 Else 部分中声明语句。

我还能如何实现它?


编辑:更改代码以使用 exec() :

IF NOT EXISTS(
SELECT 1 FROM sys.indexes
WHERE object_id = OBJECT_ID('test'))

exec('SELECT category, _TimeStamp FROM test
WITH (NOEXPAND) Where _TimeStamp >= 2018-01-24 00:00:00 and _TimeStamp < DATEADD(hh, +24, 2018-01-24 00:00:00) ORDER BY _TimeStamp ASC')

Else 
SELECT cartegory, _TimeStamp FROM test
WHERE _TimeStamp >= '2018-01-24 00:00:00' and _TimeStamp < DATEADD(hh, +24, '2018-01-24 00:00:00') ORDER BY _TimeStamp ASC

_TimeStamp 具有日期时间格式。

收到以下错误消息:

Msg 102, Level 15, State 1, Line 2 Incorrect syntax near '00'.

查询规划器在运行之前解析您的整个查询。它会将视图上的 noexpand 标记为无效,即使它位于永远不会执行的 if 子句的分支中。

您可以使用 exec 解决此问题,它在单独的范围内运行:

IF(@x = 1)
    exec (N'SELECT category, _TimeStamp 
            FROM test WITH (NOEXPAND) 
            ...')
else
    SELECT category, _TimeStamp 
    FROM test
    ...