2010-06-16 8 views
10

Pracuję z MS SQL SERVER 2003. Chcę zmienić kolumnę w jednej z moich tabel, aby mieć mniej znaków w pozycjach. Jest to identyczne z tym pytaniem: Altering a Table Column to Accept More Characters, z tym że potrzebuję mniej znaków zamiast więcej.SQL: ZMIENIAJ KOLUMNĘ na krótszy typ CHAR (n)

Mam kolumnę w jednej z moich tabel, która zawiera dziewięciocyfrowe wpisy. Deweloper pracujący wcześniej nad tabelą błędnie ustawił kolumnę tak, aby zawierała 10-cyfrowe wpisy. Muszę zmienić typ z CHAR(10) na CHAR(9).

postępując według instrukcji dyskusji związanej powyższego, pisał komunikatu

ALTER tabeli [MY_TABLE] ALTER kolumnowej [MY_COLUMN] CHAR (9);

Powoduje to wyświetlenie komunikatu o błędzie "Łańcuch lub dane binarne zostaną obcięte". Widzę, że moje dziewięciocyfrowe ciągi mają spację, która ma być dziesięciocyfrową cyfrą.

W jaki sposób powiadomić program SQL Server, aby odrzucił dodatkową przestrzeń i przekonwertował kolumnę na typ CHAR (9)?

+0

@marc_s, przepraszam, literówka –

Odpowiedz

11

Myślę, że pojawia się błąd, ponieważ w tabeli są pewne wartości, które mają dokładnie 10 znaków (bez spacji końcowych). Zmiana tabeli spowoduje więc zmniejszenie tych wartości do długości 9.

To ustawienie jest niedozwolone domyślnie. Gdyby istniały tylko ciągi, które miałyby trochę spacji, nie byłoby z tym problemu.

Tak więc, jeśli jesteś ok z cięcia te wartości, zrobić

UPDATE MY_TABLE SET MY_COLUMN = LEFT(MY_COLUMN, 9)

pierwszy, potem wykonaj alter.

+0

AKCEPTUJĄCY: To działa. Ciekawe jest jednak to, że żadna z wartości nie byłaby dłuższa niż 9 znaków bez dołączonej spacji. Jednak za pomocą instrukcji 'UPDATE' zaleca się, zanim instrukcja' ALTER' sprawdzi się. –

+0

to dziwne, ale to naprawdę działa :) – Muflix

8

Wyłączyć Ansi Warnings zanim zmienisz swój stół.

SET ANSI_WARNINGS OFF 

Pamiętaj, że dane będzie być obcięta, jeśli zdarzy się, że coś 10 znaków.

Edit

Sprawdź istniejących odcinków zanim rzeczywiście się zmienia długość kolumny.

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

Wstawiłem kod, aby najpierw sprawdzić, czy 10. bajt jest ustawiony w dowolnym miejscu, i błąd, jeśli jest. –