2010-10-11 26 views
10

Estamos recibiendo este error en una tabla en la base de datos:No se puede crear una fila de tamaño 8937 que es mayor que el máximo permitido de 8060

No se puede crear una fila de tamaño 8937 que es mayor que la permitida máximo de 8060.

La tabla abarca aproximadamente los 400 campos de varchar(max). Sin embargo, solo estamos insertando cadenas vacías en estos campos.

Parece que la inserción funciona, sin embargo cuando se utiliza SqlXml para leer los datos o cuando se ejecuta DBCC DBREINDEX en la clave principal de la tabla, se produce el error.

Se produce solo en un particular SQL Server (2005) y no en otros (2005 Express). El equipo con problema está ejecutando 64-bit Windows y los otros están ejecutando 32-bit windows.

¿Alguien tiene alguna idea al respecto? Por favor, avíseme si necesito incluir más información.


haber leído algunas de sus respuestas, me gustaría señalar que estoy completamente de acuerdo que es bastante extremo, inusual y no sensibles en absoluto a ser intentar utilizar esta cantidad de columnas varchar (max). Hay razones para ello, principalmente no bajo mi control, que no entraré aquí.

Respuesta

14

El error se debe a que no se puede tener una fila en el servidor SQL que sea mayor que 8 KB (el tamaño de 1 página) porque las filas no pueden abarcar páginas. Es un límite básico de SQL Server. Puede leer más sobre ello aquí:

Tenga en cuenta que el servidor SQL le permitirá crear la tabla, sin embargo, si se intenta insertar en realidad cualquier dato que abarca varias páginas a continuación, se le dará el error anterior.

Por supuesto, esto no acaba de sumar, porque si lo anterior fuera toda la verdad, entonces la columna VARCHAR(8000) solo llenaría una fila en una tabla. (Este solía ser el caso). SQL Server 2005 solucionó esta limitación al permitir que ciertos datos de una fila se almacenaran en otra página y, en su lugar, dejara un puntero de 24 bytes.Usted puede leer sobre esto aquí:

Como se puede ver esto ahora significa que las filas ahora pueden abarcar varias páginas, filas de columnas sin embargo individuales todavía tienen que caber en una sola página (por lo tanto, el tamaño máximo de una columna es VARCHAR(8000)) y todavía hay un límite en el número total de columnas que puede tener (alrededor de 8000/24 ​​= ~ 300 por mi estimación)

Por supuesto, esto es Me falta el punto principal, que es que 400 columnas anchas en una sola mesa es absurdo !!!

Usted debe tener una mirada larga y dura en el esquema de base de datos y llegar a algo más razonable - usted podría comenzar con la elección de algunas estimaciones más conservadoras en tamaños de las columnas (como VARCHAR(255) o VARCHAR(50)), pero que realmente necesita para dividir algunos de esos campos en tablas separadas.

+0

Muchas gracias por su respuesta. Todo está mucho más claro ahora. Estoy de acuerdo en que no es aconsejable utilizar esta cantidad de columnas varchar (max), sin embargo, su tercer enlace realmente explicó cuáles son los límites en realidad y por qué, ignorando lo que es sensato. Su cifra de 8000/24 ​​tiene sentido, ya que cada varchar (max) tendrá un puntero de 24 bytes para los datos reales. Gracias de nuevo y voy a volver a la realidad y acortar algunas de las columnas y dividir la mesa. –

+0

@EasyTimer - Me alegra saber que ayudé :-) – Justin

0

Divida la tabla en múltiples.

1

El tamaño de fila está determinado por los tipos de columnas, no la cantidad de datos que almacena en ellos.

Tener 400 campos varchar en una sola tabla me dice que estás haciendo algo mal. Tal vez necesita normalize el esquema?

9

Puede tener a deleted column en la tabla que aún ocupa espacio. También verifique que la configuración de "texto en fila" sea la misma.

+0

Muchas gracias por su respuesta que me ha dado algo de información útil, aunque he recreado completamente la tabla, por lo que no creo que ese sea el problema. –

Cuestiones relacionadas