Não é possível reconstruir o índice porque a linha está acima do tamanho máximo (Microsoft SQL)

3

Estou tentando reconstruir um índice clusterizado em uma tabela do SQL Server 2005 e continuo recebendo o erro:

Cannot create a row of size 8078 which is greater than the allowable maximum of 8060.

O comando é apenas um padrão ALTER INDEX <name> ON <table> REBUILD .

Eu não tenho ideia de como consegui 8078 bytes em uma única linha - pelo que entendi em SQL, isso não deveria ser possível.

Se eu fizer uma consulta para verificar quantos dados existem nas linhas (ou seja, Datalength (col1) + datalength (col2) ...), então a maior linha na tabela parece ser 6389 bytes, o que é bom em em relação ao limite de 8060.

Eu tentei copiar a tabela (usando o Import Export Wizard) para outro banco de dados ou outro servidor e recebo os mesmos erros sobre uma linha de 8078 bytes.

    
por Richard Gadsden 26.04.2012 / 13:39

2 respostas

1

Parece que algum programa estava colocando espaços em branco em campos de texto em vez de deixá-los como nulos, o que era suposto fazer ..

A resolução era copiar os dados para uma nova tabela (usando INSERT em vez do SSIS), mas com uma condição em cada campo de texto no SELECT assim:

CASE datalength([col1]) WHEN 0 THEN NULL ELSE [col1] END AS [col1]

Isso eliminou os campos de texto vazios que resolveram o problema - obviamente, os dados precisam ser copiados novamente, mas eu posso fazer apenas TRUNCATE TABLE [tablename] e, em seguida, INSERT INTO [tablename] SELECT * FROM [copyoftable]

Eu acho que pode ser hora de explicar sobre a existência de varchar (MAX) para algumas pessoas.

    
por 26.04.2012 / 17:44
3

O esta ajuda de postagem?

A sugestão é criar uma nova coluna TEXT (que não está sujeita ao limite de tamanho da linha), copie sua coluna de tamanho variável para ela, removendo a coluna antiga e executando DBCC CLEANTABLE . Faça isso para todas as colunas de tamanho variável e altere-as de volta para como elas eram.

    
por 26.04.2012 / 14:14