Если у вас есть строка со слишком длинным значением, создание индекса завершится неудачно. Я попробовал небольшой тестовый код с использованием SQL Server 2012.
CREATE TABLE dbo.foo
(ID bigint not null identity(1,1),
SerializedValue nvarchar(max),
LongValue as TRY_CAST(SerializedValue as bigint));
INSERT INTO dbo.foo (serializedvalue) VALUES(REPLICATE(' ', 4000)+'1');
CREATE INDEX GotToTry ON foo(LongValue);
DROP TABLE dbo.foo;
GO
Мой быстрый эксперимент показал, что код работает до тех пор, пока значение nvarchar (max) составляет 4000 символов или менее. (Конечно, все пробелы, в конце которых ничего не написано, сворачиваются без символов и, таким образом, работают просто отлично.) 4001-й символ вызывает String or binary data would be truncatedсообщение. Таким образом, вы можете проверить свои данные на предмет SerializedValue длиной более 4000 символов.
РЕДАКТИРОВАТЬ: Да, преобразование в BIGINT. Проблема не в BIGINT, а в NVARCHAR(MAX). Например:
- Если строка содержит «1111111111111111111», она будет
CREATE INDEXи преобразовать значение в BIGINT.
- Если строка имеет значение от 0 до 4000 '1, это возможно
CREATE INDEX, но значение может быть, NULLпоскольку она переполняется BIGINT.
- Если строка длиннее 4000 символов,
CREATE INDEXпроизойдет сбой.
Таким образом, похоже, что фактическое содержание NVARCHAR (MAX) имеет значение для CREATE INDEX.
РЕДАКТИРОВАТЬ: Джон Зигель определил, что TRY_CAST вызывает сбой при создании индекса, когда строка длиннее, чем nvarchar (4000).