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
...
在 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
...