none
varchar in nvarchar konvertieren RRS feed

  • Frage

  • Hi zusammen,

    ich sollte unsere Datenbank auf UNICODE umstellen. Die zu ändernden Tabellen und Spalten sind bekannt.

    Von daher benutze ich das Kommando:

    Alter table <Tabelle> alter column <Spalte> nvarchar (250)

    Da ich jedoch Tabellen mit bis zu 32 Millionen Zeilen habe dauert dies mehrere Stunden.

    Hat jemand eine Idee, mit welcher ich dies beschleuningen könnte?

    Ggf. mehrere Zeilen auf einmal konvertieren oder so?

    Danke und Gruß

    Timo

    • Typ geändert Alex Pitulice Dienstag, 19. Juni 2012 06:46 Warten auf Rückmeldung
    • Typ geändert Alex Pitulice Freitag, 22. Juni 2012 09:45 Noch aktiv
    Dienstag, 12. Juni 2012 08:20

Antworten

  • hallo Timo

    hast Du Dir schon mal ueberlegt mittels BCP die Tabelle(n) in eine Datei zu exportieren und danach wieder einzulesen nachdem Du die Spalte auf Unicode umgestellt hast?

    http://msdn.microsoft.com/en-us/library/ms162802.aspx


    Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.

    • Als Antwort vorgeschlagen Alex Pitulice Freitag, 15. Juni 2012 10:46
    • Als Antwort markiert TimoB_ Freitag, 22. Juni 2012 11:22
    Dienstag, 12. Juni 2012 15:30

Alle Antworten

  • Hallo Timo,

    Unicode benötigt doppelt so viel Speicherplatz wie Nicht-Unicode Daten, der Platz muss erst mal geschaffen werden und das kann dauern.

    Schneller würde es gehen, wenn Du eine neue Tabelle mit dem finalen Design (also alles Unicode) anlegst und die Altdaten rüber kopierst, dann die beiden Tabellen alt/neu umbenennst, um sie sozusagen auszutauschen. Anpassen der Berechtigungen aber nicht vergessen.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Dienstag, 12. Juni 2012 08:27
  • Hallo Olaf,

    die Idee hatte ich auch schon, jedoch soll diese Möglichkeit zumTeil auch auf Express Versionen eingesetzt werden und da würde ich dann an der maximalen Datenbankgröße scheitern.

    Gibt es keine Möglichkeit, dass die Konvertierung nicht zeilenweise sondern per rowset oder so vorgeht?

    Danek und gruß

    Dienstag, 12. Juni 2012 08:34
  • auch auf Express Versionen eingesetzt werden und da würde ich dann an der maximalen Datenbankgröße scheitern.

    Hallo Timo,

    da könntest mit einer zweiten (temporäre) Datenbank oder über eine temporäre arbeiten, um die Einschränkung zu umgehen.

    Wenn Du die Änderung über den Designer in SSMS vornimmst, wird es genau so gemacht.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    Dienstag, 12. Juni 2012 08:51
  • Hallo Timo,

    da könntest mit einer zweiten (temporäre) Datenbank oder über eine temporäre arbeiten, um die Einschränkung zu umgehen.

    das ist ne gute Idee... Ich probier es mal aus und sag dir, ob es was gebracht hat.

    danke.


    • Bearbeitet TimoB_ Dienstag, 12. Juni 2012 11:21
    Dienstag, 12. Juni 2012 11:20
  • Hat leider nicht nichts gebracht.

    (Der Vortei des direkten updates der Spalten ist wohl, dass ich genau weiss, welche Spalte ich anfassen und konvertieren muss.)

    Mit der temporären Datenbank hat es sogar noch länger gedauert. (ca. doppelt so lange wie vorher.)


    • Bearbeitet TimoB_ Dienstag, 12. Juni 2012 15:13
    Dienstag, 12. Juni 2012 15:12
  • hallo Timo

    hast Du Dir schon mal ueberlegt mittels BCP die Tabelle(n) in eine Datei zu exportieren und danach wieder einzulesen nachdem Du die Spalte auf Unicode umgestellt hast?

    http://msdn.microsoft.com/en-us/library/ms162802.aspx


    Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.

    • Als Antwort vorgeschlagen Alex Pitulice Freitag, 15. Juni 2012 10:46
    • Als Antwort markiert TimoB_ Freitag, 22. Juni 2012 11:22
    Dienstag, 12. Juni 2012 15:30
  • Mit der temporären Datenbank hat es sogar noch länger gedauert. (ca. doppelt so lange wie vorher.)

    Nun weiß ich nur nicht, was genau Du gemacht hast. Wenn Du Daten hin und her kopieren musst, empfiehlt es sich bei der Menge, in der Zieltabelle zunächst alle Indizes zu deaktivieren, damit die nicht Datensatz für Datensatz gepflegt werden muss, dann kopiert man die Daten und aktiviert die Indizes wieder.

    Ansonsten ist der Vorschlag von Daniel auch sehr gut, per BCP die Daten exportieren, Daten löschen, Tabellen ändern und dann die Daten wieder importieren. Das BCP eigene Format kann die Daten gut komprimieren.
    Auch hier gilt: Vorher Indizes deaktivieren und erst nach dem Datenladen neu aufbauen lassen.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing

    • Als Antwort vorgeschlagen Alex Pitulice Freitag, 15. Juni 2012 10:46
    Dienstag, 12. Juni 2012 15:42
  • Bin gerade am Testen, denke, dass ich in den nächsten Tagen ein Ergebnis melden kann.

    Mit bcp krieg ich das irgendwie nicht hin.

    Da kommt immer die Fehlermeldung:

    "Cannot use the OUTPUT option when passing a constant to a stored procedure."

    Befehl:

     bcp [tabelle] out output.dat -T -C

    Was stimmt hier nicht?

    danke und Gruß


    • Bearbeitet TimoB_ Montag, 18. Juni 2012 07:57
    Montag, 18. Juni 2012 07:40
  • Hallo Timo,

    Du musst bcp von der Kommandozeile starten, nicht im Management Studio.

    HTH!

    Einen schönen Tag noch,

    Christoph

    Montag, 18. Juni 2012 08:07
    Beantworter
  • hallo Timo,

    nimm Dir etwas Zeit und lies die Beschreibung von BCP durch:

    http://msdn.microsoft.com/en-us/library/ms162802.aspx

    das gibt Dir eine Ahnung von den notwendigen oder moeglichen Kommandozeilenparameter.

    Z.B. muesste bei "-C" ein Parameter angegeben werden.


    Please use Mark as Answer if my post solved your problem and use Vote As Helpful if a post was useful.

    Montag, 18. Juni 2012 11:12
  • Konnte jetzt ein paar Tests durchführen.

    So wie es aussieht bringt die temporäre / zweite Datenbank nichts. (der Copy Vorgang dauert zu lange.)

    Jedoch der Export (mit BCP) der größten Tabellen in eine Datei und nach Umstellung wieder ein Import sieht sehr gut aus.

    (Ich fahre die Tage noch ein paar Tests nicht großen Datenbanken und geb dann nochmals eine Rückmeldung.)

    Aber schonmal vielen Dank für eure Tipps.

    Montag, 18. Juni 2012 14:20
  • Hat funktioniert.... Danke euch beiden..

    Mit BCP geht der Umbau doch um einiges schneller. Das einzige, was jetzt noch dauert ist das hinzufügen der Indizes. Aber das ist nicht so schlimm und ich denke, dass man hier auch nichts drehen kann....

    Gruß

    Timo


    PS: Hat einer eine Idee, warum ich hier keinen Beitrag als Antwort markieren kann?
    • Bearbeitet TimoB_ Freitag, 22. Juni 2012 08:27
    Freitag, 22. Juni 2012 07:12
  • Hallo Timo,

    jetzt kannst Du. Der Thread war im Diskussion umgewandelt weil Du die Tests durchgefuhrt hattest. Jetzt ist dieser wieder aktiv und man kann die Antwort markieren.

    Gruss,

    Alex


    Alex Pitulice, MICROSOFT 
    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 22. Juni 2012 09:48