none
Datentyp nachträglich ändern RRS feed

  • Frage

  • hallo,

    ich habe eine Tabelle mit einen Feld wo der Datentyp smalint ist und möchte den Datentyp auf int ändern oder größer.  Nur das Feld dieser SQL Tabelle am SQL 2000 Server ist schon mit Daten befüllt. Nun ist meine Frage ob es da zu Problen kommen könnte, wenn ich den Datentyp nächträglich erhöhe. Wenn ja welche?

    Dienstag, 3. Juli 2012 16:29

Antworten

  • einen Integer Datentyp zu vergroessern sollte eigentlich immer verlustfrei funktionieren, sofern die Schemaaenderung zulaessig ist. z.b. kann ein Primary Key etc. nicht geaendert werden ohne, dass zuerst das Primarykey attribute entfernt wird. Technisch ist es machbar, solange Du nicht gerade milliarden von Records benutzt und dann Diskprobleme bekommst aufgrund Neuschreiben der ganzen Tabelle im Falle eines Clustered Index.

    Erlaubt der SQL Server die Aenderung, so passiert dies ziemlich schnell, da eine Metadaten Aenderung ausreicht und die Werte nicht neu geschrieben werden - dh. es wird auch nicht mehr Platz beansprucht bis die Daten wirklich neu geschrieben werden.


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

    Dienstag, 3. Juli 2012 17:02
  • Am 04.07.2012 09:23, schrieb azwinzds1:

    Das betrifft zwei Tabellen. In einer Tabelle ist das Feld Teil mit 3 anderen Werten des Primary Key's, d.h. ein Schlüsselfeld. In der anderen ist es kein Schlüsselfeld. Viele Einträge hat es auch nicht. Wie mach ich das am besten?

    Kommt drauf an was es für eine Umgebung ist.

    Aber ich würde den PK droppen, das Feld vergrößern und den PK neu erstellen. Das Ganze zur Sicherheit in eine Transaktion.

    Eine andere Frage ist natürlich, was deine Anwendung mit dem Feld macht. Erwartet es einen SMALLINT-Wert oder kann es auch mit INT umgehen?

    Mittwoch, 4. Juli 2012 08:05
  • Hallo,

    Öffne in SSMS mal die Tabelle im Designer und nimm dort die gewünschten Änderungen vor ohne zu speichern. Oben links in der Symbolleiste gibt einen Button, der Dir das Änderungsscript für die geplante Änderung erzeugt; das kannst Du als Vorlage nehmen.

    Natürlich ist das Script in erster Linie auf Sicherheit ausgelegt, so dass es möglichst unter allen Umständen anschließend das richtige Ergebnis bei raus kommt; Performanz wird dabei nicht beachtet, es gibt also immer Optimierungspotential.


    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

    Mittwoch, 4. Juli 2012 11:19

Alle Antworten

  • einen Integer Datentyp zu vergroessern sollte eigentlich immer verlustfrei funktionieren, sofern die Schemaaenderung zulaessig ist. z.b. kann ein Primary Key etc. nicht geaendert werden ohne, dass zuerst das Primarykey attribute entfernt wird. Technisch ist es machbar, solange Du nicht gerade milliarden von Records benutzt und dann Diskprobleme bekommst aufgrund Neuschreiben der ganzen Tabelle im Falle eines Clustered Index.

    Erlaubt der SQL Server die Aenderung, so passiert dies ziemlich schnell, da eine Metadaten Aenderung ausreicht und die Werte nicht neu geschrieben werden - dh. es wird auch nicht mehr Platz beansprucht bis die Daten wirklich neu geschrieben werden.


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

    Dienstag, 3. Juli 2012 17:02
  • Das betrifft zwei Tabellen. In einer Tabelle ist das Feld Teil mit 3 anderen Werten des Primary Key's, d.h. ein Schlüsselfeld. In der anderen ist es kein Schlüsselfeld. Viele Einträge hat es auch nicht. Wie mach ich das am besten?
    Mittwoch, 4. Juli 2012 07:23
  • Am 04.07.2012 09:23, schrieb azwinzds1:

    Das betrifft zwei Tabellen. In einer Tabelle ist das Feld Teil mit 3 anderen Werten des Primary Key's, d.h. ein Schlüsselfeld. In der anderen ist es kein Schlüsselfeld. Viele Einträge hat es auch nicht. Wie mach ich das am besten?

    Kommt drauf an was es für eine Umgebung ist.

    Aber ich würde den PK droppen, das Feld vergrößern und den PK neu erstellen. Das Ganze zur Sicherheit in eine Transaktion.

    Eine andere Frage ist natürlich, was deine Anwendung mit dem Feld macht. Erwartet es einen SMALLINT-Wert oder kann es auch mit INT umgehen?

    Mittwoch, 4. Juli 2012 08:05
  • Wie mach ich das innterhalb einer Transaktion? Wie ist da der COde?
    Mittwoch, 4. Juli 2012 08:26
  • Hallo,

    Öffne in SSMS mal die Tabelle im Designer und nimm dort die gewünschten Änderungen vor ohne zu speichern. Oben links in der Symbolleiste gibt einen Button, der Dir das Änderungsscript für die geplante Änderung erzeugt; das kannst Du als Vorlage nehmen.

    Natürlich ist das Script in erster Linie auf Sicherheit ausgelegt, so dass es möglichst unter allen Umständen anschließend das richtige Ergebnis bei raus kommt; Performanz wird dabei nicht beachtet, es gibt also immer Optimierungspotential.


    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

    Mittwoch, 4. Juli 2012 11:19
  • Wie mach ich das innterhalb einer Transaktion? Wie ist da der COde?

    nimm Dir etwas Zeit und mach Dich etwas mit SQL Server und SQL Befehlen bekannt. Diese Zeit ist eine gute Investition und wird Dir und anderen viel vermeidbaren Frust ersparen.


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

    Donnerstag, 5. Juli 2012 14:21
  • Hallo azwinzds1,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


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

    Mittwoch, 1. August 2012 13:01
    Moderator