2010-06-16 7 views
10

Ich arbeite mit MS SQL SERVER 2003. Ich möchte eine Spalte in einer meiner Tabellen ändern, um weniger Zeichen in den Einträgen zu haben. Das ist identisch mit dieser Frage: Altering a Table Column to Accept More Characters außer der Tatsache, dass ich weniger Zeichen anstelle von mehr will.SQL: ALTER COLUMN zu kürzerem CHAR (n) Typ

Ich habe eine Spalte in einer meiner Tabellen, die neunstellige Einträge enthält. Ein Entwickler, der zuvor an der Tabelle gearbeitet hat, hat fälschlicherweise die Spalte so eingestellt, dass sie zehnstellige Einträge enthält. Ich muss den Typ von CHAR(10) zu CHAR(9) ändern.

Im Anschluss an die Anweisungen aus der obigen Diskussion verknüpft ist, schrieb ich die Aussage

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

Dies gibt die Fehlermeldung "Zeichenfolge oder binäre Daten werden abgeschnitten" zurück. Ich sehe, dass meine neunstelligen Strings ein Leerzeichen angehängt haben, um sie zehnstellig zu machen.

Wie sage ich SQL Server, den zusätzlichen Speicherplatz zu verwerfen und meine Spalte in einen Typ CHAR (9) zu konvertieren?

+0

@marc_s, sorry, typo –

Antwort

11

Ich denke, Sie erhalten den Fehler, weil es einige Werte in dieser Tabelle gibt, die genau 10 Zeichen lang sind (ohne abschließende Leerzeichen). Das Ändern der Tabelle würde daher diese Werte auf die Länge 9 reduzieren.

Dies ist standardmäßig nicht zulässig. Wenn es nur Zeichenfolgen geben würde, die nachstehende Leerzeichen hätten, wäre das kein Problem.

Also, wenn Sie mit schneidender diese Werte in Ordnung sind, tun

UPDATE MY_TABLE SET MY_COLUMN = LEFT(MY_COLUMN, 9)

zuerst, danach das Alter tun.

+0

AKZEPTIERT: Das funktioniert. Das Interessante ist jedoch, dass keiner der Werte mehr als 9 Zeichen ohne Leerzeichen enthalten hätte. Verwenden Sie jedoch die 'UPDATE'-Anweisung, die Sie vor der' ALTER'-Anweisung empfehlen, damit es funktioniert. –

+0

es ist seltsam, aber es funktioniert wirklich :) – Muflix

8

Deaktivieren Sie Ansi Warnings bevor Sie Ihre Tabelle ändern.

SET ANSI_WARNINGS OFF 

, dass die Daten Vorsicht wird abgeschnitten, wenn Sie etwas 10 Zeichen haben lange passieren.

bearbeiten

prüfen Längen bestehenden, bevor sie tatsächlich die Spaltenlänge zu ändern.

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

Ich würde Code eingeben, um zuerst zu überprüfen, ob das 10. Byte irgendwo gesetzt ist, und Fehler, wenn es ist. –