Если у вас есть строка со слишком длинным значением, создание индекса завершится неудачно. Я попробовал небольшой тестовый код с использованием 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).