2009-03-12 40 views
5

Tengo una tabla que tiene el campo ntext. MSDN dice que ntext es obsoleto y se sugieren otros tipos de datos:Cambiar el tipo de columna de ntext a varbinary (max)

ntext, text, and image data types will be removed in a future version of Microsoft SQL Server. Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max), and varbinary(max) instead.

En mi caso particular, se decidió cambiar a varbinary(max). Traté de alterar la definición de la tabla pero eso no funcionó.

ALTER TABLE MyTable ALTER COLUMN MyColumn VARBINARY(MAX); 

¿Cuáles son las posibilidades de cambiar el tipo de varbinary(max)? He intentado cambiar el tipo de ntext ->nvarchar(max) y luego de nvarchar(max) ->varbinary(max) pero eso no es posible (error: la conversión implícita del tipo de datos nvarchar (max) a varbinary (max) no está permitido).

La única solución de trabajo es agregar una nueva columna de tipo varbinary(max), convertir el valor existente a la nueva columna y luego soltar la columna anterior. Esto toma MUCHO MUCHO tiempo (en mi conjunto de datos de aproximadamente 15 GB tarda unos 30 minutos). Es por eso que estoy investigando otras posibilidades para lograr lo mismo (posiblemente in situ = sin mover datos y conversiones).

Respuesta

3

Supongo que fuiste con varbinary (max) porque tu columna ntext no contenía datos textuales. En ese caso, creo que tendrá que agregar una columna varbinary (max) separada a su tabla, luego ejecutar una operación de conversión para copiar desde el ntext a la nueva columna. A continuación, elimine la columna anterior y cambie el nombre de la nueva columna por el nombre anterior.

"La conversión implícita del tipo de datos nvarchar (max) a varbinary (max) no está permitido" significa que tendrá que ser explícito sobre la conversión.

+0

Sí, tengo texto comprimido en esa columna. –

+0

Gracias por la respuesta. Supongo que tendremos que ejecutar la conversión. –

0

Parece que esta conversión tendrá que suceder en algún momento. Si busca, encontrará muchas personas yendo de texto a varchar (máximo) e indicando que tarda más de 20 minutos en convertirse. Mis dos centavos después de investigar durante unos minutos, así que no lo tomes como un evangelio.

Si su tabla solo toma inserciones, puede convertir los datos existentes en una tabla de retención y luego cambiar el nombre de las tablas para que la retención sea la producción. A continuación, mueva los datos recién creados de la tabla anterior durante el tiempo de inactividad.

El manejo de las actualizaciones hace que las cosas sean más complejas, por supuesto.

+0

Muchas gracias por la respuesta. Sí, probablemente tengas razón. Esperaba que hubiera otra forma de hacer esto. Gracias. –

0

Agregar la columna adicional es probablemente la mejor manera de hacerlo. Estoy a favor de hacer este tipo de cosas en los pasos para reducir los riesgos

  1. Añadir al varbinary columna (max) como anulable
  2. modificar el código de inserción para poblar las dos columnas
  3. En su tiempo libre, por ejemplo durante la noche, ejecutar la instrucción UPDATE con un reparto
  4. Eliminar todo el apoyo para el código de la columna de edad, asegúrese de nueva columna se lee
  5. gota la columna de edad, y cambiar la nueva columna a ser no nulo si es necesario
+0

Muchas gracias por la respuesta. Esto es lo que tengo actualmente. Estaba buscando una alternativa, pero supongo que no hay ninguna. –

Cuestiones relacionadas