Forums Neueste Beiträge
 

nvarchar in varchar

11/06/2008 - 13:20 von Jörg Schneider | Report spam
Hi @all!


wir haben leider vor ein paar Jahren eine DB aufgesetzt deren "char"
Tabellenfelder mit nvarchar erzeugt wurden.

Nun würden wir gerne den Datentyp dieser Spalten auf varchar zurückstellen.

alter table vertreter alter column verkuerzel varchar(5)

Leider bekommen wir dabei bei einigen Spalten folgenden Fehler:

Meldung 511, Ebene 16, Status 1, Zeile 1
Eine Zeile der Größe 8067 kann nicht erstellt werden, da sie lànger als
das zulàssige Maximum von 8060 wàre.
Die Anweisung wurde beendet.


Lasse ich folgende Abfrage laufen:
select sum(length) from syscolumns
inner join sysobjects on syscolumns.id =sysobjects.id and
sysobjects.name = 'vertreter'

bekomme ich 6576 Zeichen zurück. Und durch den Alter auf varchar sollte
die Tabelle ja sogar kleiner werden, da kein doppelbyte für den Unicode
mehr benötigt wird.


Was können wir da machen?
Was machen wir falsch?

Danke für jeden Antwort schon mal im voraus.


Jörg Schneider
 

Lesen sie die antworten

#1 Elmar Boye
11/06/2008 - 14:52 | Warnen spam
Hallo Jörg,

Jörg Schneider schrieb:
wir haben leider vor ein paar Jahren eine DB aufgesetzt deren "char"
Tabellenfelder mit nvarchar erzeugt wurden.



Welche SQL Server Version: 2000 (oder 2005)?

Nun würden wir gerne den Datentyp dieser Spalten auf varchar zurückstellen.

alter table vertreter alter column verkuerzel varchar(5)

Leider bekommen wir dabei bei einigen Spalten folgenden Fehler:

Meldung 511, Ebene 16, Status 1, Zeile 1
Eine Zeile der Größe 8067 kann nicht erstellt werden, da sie lànger als
das zulàssige Maximum von 8060 wàre.
Die Anweisung wurde beendet.

Lasse ich folgende Abfrage laufen:
select sum(length) from syscolumns
inner join sysobjects on syscolumns.id =sysobjects.id and
sysobjects.name = 'vertreter'

bekomme ich 6576 Zeichen zurück.



Da scheinen làngere Werte enthalten zu sein,
als die Tabellendefinition aussagt.

Bilde mal die Summe über die (N)(VAR)CHAR Spalten via
DATALENGTH(Spalte1) + DATALENGTH(Spalte2) ...

bzw. ermittle das Maximum via MAX(DATALENGTH(Spalte))

Was können wir da machen?



Eine alternative Vorgehensweise wàre:
Erstellen einer neue Tabelle und einfügen via
INSERT INTO dbo.VertreterNeu(..., verkuerzel , )
SELECT CAST(verkuerzel AS varchar(5)),

FROM dbo.Vertreter

und anschließendes Löschen der alten und Umbenennen der neuen.

Wobei das Basis Skript Dir der Enterprise Manager erstellen kann,
wenn Du die Tabellendefinition dort ànderst (inkl. Transaktionsteuerung,
löschen/erstellen Fremdschlüssel, Einschrànkungen usw.)

Anstatt es direkt auszuführen solltest Du es aber speichern
und überprüfen und ggf. Anpassungen vornehmen.

Gruß Elmar

Ähnliche fragen