Tenho uma tabela Foo
com os seguintes campos:
ID bigint not null identity(1,1),
SerializedValue nvarchar(max),
LongValue as TRY_CAST(SerializedValue as bigint)
Agora quero criar um índice em LongValue, para que eu possa pesquisar facilmente valores serializados que representam números.
create nonclustered index IX_Foo on Foo(LongValue);
Que cospe o seguinte erro para mim:
String ou dados binários seriam truncados.
Sim, existem dados em SerializedValue. Mas o que, por favor, pode ser truncado ao criar um índice em um campo computado?
O erro não é causado pela criação do índice. O erro é causado
TRY_CAST
quando os valores da coluna computada são avaliados na criação do índice.Se eu executar isso:
Eu recebo o mesmo erro.
A documentação diz (ênfase minha):
Agora, não está exatamente claro em quais casos ele falhará com um erro (parece meio estúpido considerando todo o objetivo da função, mas de qualquer maneira...), então podemos consertar o código transformando os valores de entrada (use algo razoável para os dados em sua tabela), pois não há necessidade de processar uma string enorme quando ela não cabe em um bigint de qualquer maneira:
Isso retorna
NULL
como o valor não é válido, mas não bombardeia com um erro.Se você tiver uma string com um valor muito longo, a criação do índice falhará. Eu tentei um pequeno código de teste usando o SQL Server 2012.
Meu experimento rápido mostrou que o código funciona desde que o valor nvarchar(max) seja de 4.000 caracteres ou menos. (Claro, todos os espaços em branco sem nada no final se reduzem a nenhum caractere e, portanto, funcionam muito bem.) O 4001º caractere aciona a
String or binary data would be truncated
mensagem. Portanto, você pode examinar seus dados em busca de um SerializedValue com mais de 4.000 caracteres.EDIT: Sim, a conversão é para um arquivo
BIGINT
. O problema não é oBIGINT
, mas é oNVARCHAR(MAX)
. Por exemplo:CREATE INDEX
converterá o valor emBIGINT
.CREATE INDEX
, mas o valor pode serNULL
, pois estouraBIGINT
.CREATE INDEX
falha.Portanto, parece que o conteúdo real de NVARCHAR(MAX) é o que importa para CREATE INDEX.
EDIT: Jon Seigel identificou que o TRY_CAST aciona a falha na criação do índice quando a string é maior que nvarchar (4000).