SQL Server: ошибка вычисленного выражения - PullRequest
1 голос
/ 22 октября 2010

Вот таблица с вычисляемым столбцом в SQL Server 2005:

CREATE TABLE footable AS
  [identifier] nvarchar(255) NOT NULL,
  [result]     AS CASE 
    WHEN [identifier] like '%\[%]' escape '\'
    THEN LEFT( [identifier], CHARINDEX('[',[identifier]) - 1 )
    END

Вот что я ожидаю:

identifier      result
======================
foo[bar]        foo
foo             NULL

Это сработало несколько дней назад и работает уже более года.

Затем вчера я начал получать эту ошибку при вставке или обновлении с identifier значениями, которые не имели [, когда NULL был бы ожидаемым результатом:

Invalid length parameter passed to the left function.

Теперь, сегодня, он снова работает.

Почему SQL Server пытается решить функцию LEFT(), если CASE не соответствует действительности?

Что более важно, почему он работает один день, а не следующий?

Вчера я также создавал некоторые индексированные представления, хотя и не охватывал ни один из этих столбцов. Может ли один из параметров SET, необходимых для индексации представления, заставить базу данных начать выдавать ошибки для выражения, подобного этому?

1 Ответ

0 голосов
/ 28 октября 2011

Я бы использовал

N'[^[]%\[%]' escape N'\'  

Это должно учитывать возможность того, что первым символом будет [.

Или, если вы хотите вернуть ненулевое значение (пустую строку?) В этом случае, используйте вложенный CASE для обработки условия CHARINDEX, возвращающего 1.

Кстати, вам не нужен этот escape-символ или оператор escape. Вы можете использовать [[], чтобы соответствовать [символ:

N'[^[]%[[]%]'

Но это вопрос личного вкуса. Я вижу, как эта версия немного яснее

...