Это уродливый обходной путь, но вы могли бы сделать что-то вроде этого, возможно:
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 вы используете.