2010-06-16 8 views
10

Estoy trabajando con MS SQL SERVER 2003. Quiero cambiar una columna en una de mis tablas para tener menos caracteres en las entradas. Esto es idéntico a esta pregunta: Altering a Table Column to Accept More Characters excepto por el hecho de que quiero menos caracteres en lugar de más.SQL: ALTER COLUMN para abreviar CHAR (n) tipo

Tengo una columna en una de mis tablas que contiene entradas de nueve dígitos. Un desarrollador que trabajó previamente en la tabla configuró erróneamente la columna para contener entradas de diez dígitos. Necesito cambiar el tipo de CHAR(10) a CHAR(9).

Siguiendo las instrucciones de la discusión vinculado anteriormente, que escribió la declaración

ALTER TABLE [MY_TABLE] ALTER COLUMN [MY_COLUMN] CHAR (9);

Esto devuelve el mensaje de error "La cadena o los datos binarios se truncarán". Veo que mis cadenas de nueve dígitos tienen un espacio adjunto para que tengan diez dígitos.

¿Cómo le digo a SQL Server que descarte el espacio adicional y convierta mi columna en un tipo CHAR (9)?

+0

@marc_s, lo siento, error –

Respuesta

11

Creo que se obtiene el error porque hay algunos valores en esa tabla que son exactamente 10 caracteres de largo (sin espacios finales). Alterar la tabla reduciría estos valores a la longitud 9.

Esto no está permitido por defecto. Si solo hubiera cadenas que tendrían algunos espacios finales, no habría ningún problema con eso.

Por lo tanto, si estás bien con el corte de esos valores, hacer

UPDATE MY_TABLE SET MY_COLUMN = LEFT(MY_COLUMN, 9)

en primer lugar, después de que lo hacen el altar.

+0

ACEPTO: Esto funciona. Lo interesante, sin embargo, es que ninguno de los valores debería haber sido más de 9 caracteres sin un espacio adjunto. Sin embargo, usando la instrucción 'UPDATE' que recomiendas antes de que la instrucción' ALTER' lo haga funcionar. –

+0

es extraño, pero realmente funciona :) – Muflix

8

Desactive Ansi Warnings antes de modificar su tabla.

SET ANSI_WARNINGS OFF 

Mira que los datos se truncarse si le sucede que tiene algo de 10 caracteres.

Editar

Comprobar longitudes existente antes de cambiar realmente la longitud de la columna.

SET ANSI_WARNINGS OFF 
GO 

CREATE TABLE Test (Value CHAR(10)) 
INSERT INTO Test SELECT ('1234567890') 

IF NOT EXISTS (SELECT * FROM Test WHERE LEN(Value) > 9) 
    ALTER TABLE Test ALTER COLUMN Value CHAR(9) 
ELSE 
    SELECT LEN(Value), * FROM Test WHERE LEN(Value) > 9 

DROP TABLE Test 
+1

Me gustaría poner el código para comprobar primero si el décimo byte se establece en cualquier lugar, y el error si es así. –

Cuestiones relacionadas