这是一个丑陋的解决方法,但您也许可以这样做:
DECLARE @x TABLE(StringField VARCHAR(32));
INSERT @x SELECT 'ABC'
UNION ALL SELECT 'A'
UNION ALL SELECT 'AAAAAAAABC';
SELECT SUBSTRING(StringField, 5, CHARINDEX('ABC', StringField) - 5)
FROM @x
WHERE CHARINDEX('ABC', StringField) > 5;
SELECT SUBSTRING(StringField,
CASE WHEN CHARINDEX('ABC', StringField) > 5 THEN 5 ELSE 1 END,
CHARINDEX('ABC', StringField) -
CASE WHEN CHARINDEX('ABC', StringField) > 5 THEN 5 ELSE 0 END)
FROM @x
WHERE CHARINDEX('ABC', StringField) > 5;
两者都产生:
---
AAA
但我怀疑你认为后者会被允许。这很丑陋,但不幸的是,除非您首先将过滤后的数据转储到 #temp 表(或尝试查看是否MAXDOP
可靠地消除了问题),否则您将无法控制处理顺序。
另一个想法是尝试将计算列放入表中(但我不确定如果您尝试创建索引视图会有所帮助 - 可能仍然存在并发症)。或者使用带有该表达式的过滤索引,而不是索引视图。如果我们知道索引视图的目的是什么以及您使用的是什么版本的 SQL Server,那么可能有几个“解决方案”。