2010-06-16 31 views
10

Sto lavorando con MS SQL SERVER 2003. Voglio modificare una colonna in una delle mie tabelle per avere meno caratteri nelle voci. Questo è identico a questa domanda: Altering a Table Column to Accept More Characters tranne per il fatto che voglio meno caratteri invece di più.SQL: ALTER COLUMN a breve CHAR (n) tipo

Ho una colonna in una delle mie tabelle che contiene voci di nove cifre. Uno sviluppatore che ha lavorato in precedenza sulla tabella ha erroneamente impostato la colonna per contenere le voci a dieci cifre. Devo cambiare il tipo da CHAR(10) a CHAR(9).

Seguendo le istruzioni dalla discussione linkato sopra, ho scritto la dichiarazione

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

Questo restituisce il messaggio di errore "String o dati binari sarebbero troncati". Vedo che le mie stringhe a nove cifre hanno uno spazio aggiunto per renderle dieci cifre.

Come è possibile indicare a SQL Server di eliminare lo spazio extra e convertire la colonna in un tipo CHAR (9)?

+0

@marc_s, spiacente, errore di battitura –

risposta

11

Penso che si sia verificato l'errore perché ci sono alcuni valori in quella tabella che sono esattamente 10 caratteri lunghi (senza spazi finali). La modifica della tabella ridurrebbe quindi questi valori alla lunghezza 9.

Questo non è consentito per impostazione predefinita. Se ci fossero solo stringhe che avrebbero degli spazi finali, non ci sarebbe alcun problema.

Quindi, se siete ok con il taglio quei valori, fare

UPDATE MY_TABLE SET MY_COLUMN = LEFT(MY_COLUMN, 9)

prima, dopo che l'altare.

+0

ACCETTATO: Questo funziona. La cosa interessante, tuttavia, è che nessuno dei valori sarebbe stato più lungo di 9 caratteri senza uno spazio aggiunto. Tuttavia, usando l'istruzione 'UPDATE' che si consiglia prima che l'istruzione' ALTER' la renda funzionante. –

+0

è strano ma funziona davvero :) – Muflix

8

Disabilitare Ansi Warnings prima di modificare il tavolo.

SET ANSI_WARNINGS OFF 

Attenzione che i dati saranno troncato se vi capita di avere qualcosa di 10 caratteri.

Modifica

Controllare lunghezze esistente prima di poter realmente cambiare la lunghezza della colonna.

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

Metterei in codice per prima cosa controllare se il decimo byte è impostato ovunque, e l'errore è fuori se lo è. –

Problemi correlati